美文网首页
Swift中 == 与 === 的不同

Swift中 == 与 === 的不同

作者: AprSnow | 来源:发表于2018-07-31 00:24 被阅读29次

    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中 == 与 === 的不同

          本文链接:https://www.haomeiwen.com/subject/pszqvftx.html