为什么 == 和 === 平等对于 UIView 类的作用似乎是一样的?

问题描述 投票:-1回答:2

我想知道什么时候应该使用==来比较UIViews。我意识到我一直在使用==,而没有真正思考UIView是一种引用类型。但它从来没有给我带来任何问题,所以似乎===对于UIViews来说永远不需要?

我对值比较==,和身份比较==的理解,是基于 此前的问题 是对于类来说,你需要使用==来知道是否有相同的实例,而==来知道它们是否有相同的值。然而对于UIView类来说,==似乎和==操作符完全一样。

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是否是不同的实例,我应该使用==,而==应该是true,因为它们有相同的属性值。然而事实并非如此。

failed tests

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

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

ios swift uiview uikit equality
2个回答
3
投票

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


0
投票

两个不同的 UIView 实例的所有属性都是一样的。

当你比较两个不同的单独实例时 UIView的'(数值不同),使用 == 除非你符合 Equatable 协议,并提供一个自定义的平等标准。

另外: === 返回false,因为它们的引用有不同的堆位置。

© www.soinside.com 2019 - 2024. All rights reserved.