我想知道什么时候应该使用==来比较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,因为它们有相同的属性值。然而事实并非如此。
==和==都是假的。这些不是应该以不同的方式工作吗?这些视图具有相同的属性值。
UIView是否使用===来实现Equatable?有没有理由在UIViews上使用===?
这是因为默认情况下 ==
对于Objective-C对象 是 ===
. 如果不是这样(例如,逐个属性比较),你需要覆盖 isEqual:
但一般情况下,Cocoa类不会这样做。(像NSString这样的基础类显然会这样做;重要的是字符串的字符,而不是它的存储位置。)
两个不同的 UIView
实例的所有属性都是一样的。
当你比较两个不同的单独实例时 UIView
的'(数值不同),使用 ==
除非你符合 Equatable
协议,并提供一个自定义的平等标准。
另外: ===
返回false,因为它们的引用有不同的堆位置。