`==` 和 `=== ` 运算符之间的区别
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!")
}
总结:
==
(或!=
)
- 检查值是否相等
- 比较值类型
- isEqual:就像Obj-C 行为中的默认值一样
===
(或!==
)
- 检查引用是否相等
- 比较引用类型
- 就像==在 Obj-C(指针相等)中一样
参考:https://stackoverflow.com/questions/24002819/difference-between-and
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)