为什么 == 和 === 相等对于 UIView class 似乎一样有效?

Why does == and === equality seem to work the same for UIView class?

我在想什么时候应该使用 === 来比较 UIView。我意识到我一直在使用 == 而没有真正考虑 UIView 如何成为引用类型。但它从来没有给我带来任何问题,所以看起来 UIViews 永远不需要 ===?

我基于this previous question对价值比较==和身份比较===的理解是,对于classes你需要使用===来知道你是否有相同的instance 和 == 来判断它们是否具有相同的值。然而,对于 UIView class,== 似乎与 === 运算符完全一样。

let v1 = UIView()
let v2 = UIView()
XCTAssertTrue(v1 === v1)
XCTAssertTrue(v1 == v1)
XCTAssertTrue(v1.isEqual(v1))

XCTAssertFalse(v1 === v2)
XCTAssertTrue(v1 == v2)
XCTAssertTrue(v1.isEqual(v2))

基于这种理解,我希望这些都能通过。要知道 v1 和 v2 是否是不同的实例,我应该使用 ===,并且 == 应该为真,因为它们具有相同的 属性 值。然而事实并非如此。

== 和 === 都是错误的。这些不应该以不同的方式工作吗?这些视图具有相同的 属性 值。

UIView是否使用===来实现Equatable?没有理由在 UIView 上使用 === 吗?

两个不同的 UIView 实例不太可能具有相同的所有属性。

当您使用 == 比较两个不同的实例 UIView(具有不同的值)时,除非您遵守 Equatable 协议并提供自定义平等标准。

另外,=== returns false 因为他们的引用有不同的堆位置。

这是因为默认情况下 == 对于 Objective-C 个对象 ===。如果不是这样(例如 属性-by-属性 比较),您需要覆盖 isEqual:,但通常 Cocoa 类 不需要。 (基础 类,例如 NSString 显然可以;重要的是字符串的字符,而不是它的存储位置。)