신속하게 두 개의 등호 연산자가있는 것 같습니다 : 이중 등호 ( ==
)와 삼중 등호 ( ===
), 둘의 차이점은 무엇입니까?
요컨대 :
==
연산자는 인스턴스 값이 같은지 확인합니다. "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] 삭제
몇 마디 만하겠습니다