为什么 == 和 === 相等对于 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 显然可以;重要的是字符串的字符,而不是它的存储位置。)
我在想什么时候应该使用 === 来比较 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 显然可以;重要的是字符串的字符,而不是它的存储位置。)