UITextField中==与===的对比:为何两者表现一致?
UITextField的Equatable实现与==比较逻辑解析
问题背景
有两个UITextField实例,原本使用===检查引用一致性,误写为==后结果和===完全一致。想明确UITextField是否遵循Equatable协议,以及==的具体比较逻辑。
示例代码与输出
测试代码
let textFieldA = UITextField() let textFieldB = UITextField() textFieldA.text = "A" textFieldB.text = "B" print("A.text", textFieldA.text) print("B.text", textFieldB.text) print("A == A:", textFieldA == textFieldA) print("A == B:", textFieldA == textFieldB) print("A === B:", textFieldA === textFieldB) textFieldB.text = "A" print("A.text", textFieldA.text) print("B.text", textFieldB.text) print("A == A:", textFieldA == textFieldA) print("A == B:", textFieldA == textFieldB) print("A === B:", textFieldA === textFieldB)
输出结果
A.text Optional("A") B.text Optional("B") A == A: true A == B: false A === B: false A.text Optional("A") B.text Optional("A") A == A: true A == B: false A === B: false
底层实现原理
- UITextField继承自UIView,而UIView是NSObject的子类。在Swift中,所有NSObject的子类都会自动获得Equatable协议的默认实现。
- 这个默认实现的核心是调用NSObject的
isEqual(_:)方法,而NSObject的isEqual(_:)默认逻辑就是比较对象的内存地址(引用一致性),和===的行为完全相同。 - UITextField并没有重写
isEqual(_:)方法,因此它的==比较不会去检查text、frame等属性是否相等,只会判断两个实例是否为同一个对象。 - 这就解释了为什么示例中即使两个UITextField的text属性相同,
==依然返回false——因为它们是两个不同的实例,内存地址不一样。
内容的提问来源于stack exchange,提问作者Heuristic
相关产品推荐
相关产品推荐

