Swift中 == 与 === 的不同

Difference between == and ===

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!")
}

虽然 person1person2 指向两个堆空间上不同的实例,但是他们的实例是相等的,因为有相同的 ssn。因此输出 the two instance are equal!

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

=== 操作检查引用是否指向同一个实例。因为在堆上 person1person2 有不同的实例,他们不是完全相同的,输出 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!

你可能感兴趣的:(Swift中 == 与 === 的不同)