In short:
==
操作检测实例的值是否相等,"equal to"
===
操作检测指针引用的是否为同一个实例,"identical to"
Long Answer:
类是引用类型,可能存在不同的常量和变量指向同一个类的实例。类引用保存在运行时栈内(Run Time Stack, RTS
),类的实例保存在内存的堆上。当你使用 ==
相等时,表示类的的实例是相等的。这并不需要是同一个实例。对于自定义的类需要提供一个相等的条件,通常,自定义类和结构体没有默认的 相等 操作,包括等于 ==
和不等于 !=
。自定义类需要实现 Equatable
协议和静态方法 static func == (lhs:, rhs:) -> Bool function
。
考虑如下例子:
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
相等就可以,并不需要 name
相等。
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!")
}
===
操作检查引用是否指向同一个实例。因为在堆上 person1
和 person2
有不同的实例,他们不是完全相同的,输出 the two instances are not identical!
。
let person3 = person1
P.S: 类是引用类型,person1 的引用被复制给 person3,因此在堆上他们的引用指向同一个实例。
if person3 === person1 {
print("the two instances are identical!")
}
他们是完全相等的,输出 the two instances are identical!
。
网友评论