==와 ===의 차이점

Fela Winkelmolen :

신속하게 두 개의 등호 연산자가있는 것 같습니다 : 이중 등호 ( ==)와 삼중 등호 ( ===), 둘의 차이점은 무엇입니까?

Fatih Aksu :

요컨대 :

== 연산자는 인스턴스 값이 같은지 확인합니다. "equal to"

=== 연산자는 참조가 동일한 인스턴스를 가리키는 지 확인합니다. "identical to"

긴 답변 :

클래스는 참조 유형이며 여러 상수와 변수가 배후에서 클래스의 동일한 단일 인스턴스를 참조 할 수 있습니다. 클래스 참조는 런타임 스택 (RTS)에 있고 해당 인스턴스는 메모리의 힙 영역에 있습니다. 동등성을 제어 ==한다는 것은 인스턴스가 서로 동일한 지 여부를 의미합니다. 동일하기 위해 동일한 인스턴스 일 필요는 없습니다. 이를 위해 사용자 정의 클래스에 동등 기준을 제공해야합니다. 기본적으로 사용자 정의 클래스 및 구조는 "같음"연산자 ==및 "같지 않음 "연산자라고하는 등가 연산자의 기본 구현을받지 않습니다 !=. 이를 위해 사용자 정의 클래스는 Equatable프로토콜 을 준수해야하며 static func == (lhs:, rhs:) -> Bool기능입니다.

예를 살펴 보겠습니다.

class Person : Equatable {
    let ssn: Int
    let name: String

    init(ssn: Int, name: String) {
        self.ssn = ssn
        self.name = name
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.ssn == rhs.ssn
    }
}

P.S.: ssn (사회 보장 번호)은 고유 한 번호이므로 이름이 같은지 비교할 필요가 없습니다.

let person1 = Person(ssn: 5, name: "Bob")
let person2 = Person(ssn: 5, name: "Bob")

if person1 == person2 {
   print("the two instances are equal!")
}

person1 및 person2 참조가 힙 영역에서 서로 다른 두 인스턴스를 가리 키지 만 ssn 번호가 같기 때문에 인스턴스가 동일합니다. 따라서 출력은the two instance are equal!

if person1 === person2 {
   //It does not enter here
} else {
   print("the two instances are not identical!")
}

===연산자는 참조가 동일한 인스턴스를 가리키는 지 확인합니다 "identical to". person1과 person2는 힙 영역에 두 개의 다른 인스턴스가 있으므로 동일하지 않고 출력the two instance are not identical!

let person3 = person1

P.S: 클래스는 참조 유형이며 person1의 참조는이 할당 작업을 통해 person3에 복사되므로 두 참조 모두 힙 영역에서 동일한 인스턴스를 가리 킵니다.

if person3 === person1 {
   print("the two instances are identical!")
}

그들은 동일하며 출력은 the two instances are identical!

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관