`==` 和 `=== ` 运算符之间的区别

1. ==(或!=)运算符检查它们的实例值是否相等,"equal to"
它默认比较基本类型的值,比如:Int,String等,它不可以比较引用类型(reference type)或值类型(value type),除非该类实现了Equatable

import Foundation

class CCPerson: Equatable {
    var ssn: Int? = nil
    var name: String? = nil
    
    init(ssn: Int?, name: String?) {
        self.ssn = ssn
        self.name = name
    }
    // 实现Equatable协议方法
    static func == (lhs: CCPerson, rhs: CCPerson) -> Bool {
        return lhs.ssn == rhs.ssn
    }
}

    let ccp1 = CCPerson(ssn: 5, name: "Bob")
    let ccp2 = CCPerson(ssn: 5, name: "John")
    // 虽然 ccp1 和 ccp2 引用指向堆区域中的两个不同实例,但它们的实例是相等的,因为它们的 ssn 编号相等。所以输出将是the two instance are equal!
    if ccp1 == ccp2 {
        print("the two instances are equal!")
    }

注意:如果CCPerson类不实现Equatable协议的话,它是不支持==运算符的

2.===(或!==)运算符检查引用是否指向同一实例(同一个内存地址),"identical to"
它是检查两个对象是否完全一致(它会检测对象的指针是否指向同一地址),它只能比较引用类型(reference type),不可以比较基本类型和值类型(type value)

    let ccp1 = CCPerson(ssn: 5, name: "Bob")
    let ccp2 = CCPerson(ssn: 5, name: "John")
    // ===运算符检查引用是否指向同一个实例,"identical to". 由于 ccp1 和 ccp2 在 Heap 区域有两个不同的实例,所以它们不相同,输出the two instance are not identical!
     if ccp1 === ccp2 {
         print("the two instances are identical!")
      } else {
          print("the two instances are not identical!")
      }
       let ccp3 = ccp1
       // person1 的引用通过此赋值操作复制到 ccp3,因此两个引用都指向堆区域中的同一个实例。它们是相同的,输出将是the two instances are identical!
       if ccp3 === ccp1 {
           print("the two instances are identical!")
       } else {
           print("the two instances are not identical!")
       }

总结:

  1. ==(或!=
  • 检查值是否相等
  • 比较值类型
  • isEqual:就像Obj-C 行为中的默认值一样
  1. ===(或!==
  • 检查引用是否相等
  • 比较引用类型
  • 就像==在 Obj-C(指针相等)中一样

参考:https://stackoverflow.com/questions/24002819/difference-between-and

posted @   窈窕君子  阅读(351)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示