【问题标题】:Why does == and === equality seem to work the same for UIView class?为什么 == 和 === 相等性似乎对 UIView 类起作用?
【发布时间】:2020-08-16 07:47:18
【问题描述】:

我试图弄清楚何时应该使用 === 来比较 UIView。我意识到我一直在使用 == 而没有真正考虑 UIView 如何是引用类型。但它从来没有给我带来任何问题,所以 UIViews 似乎永远不需要 ===?

基于this previous question,我对值比较 == 和身份比较 === 的理解是,对于类,您需要使用 === 来了解您是否有相同的实例,并使用 == 来了解它们是否相同具有相同的价值。但是对于 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 上使用 === 吗?

【问题讨论】:

  • “UIView 是否使用 === 来实现 Equatable”我不确定,但这似乎很合理。我真的无法想象你会如何定义两个视图的相等性。

标签: ios swift uiview uikit equality


【解决方案1】:

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

【讨论】:

  • 所以通常对于任何 NSObject 子类,我都不需要使用 ===,除非我知道它会以某种方式覆盖 isEqual?我想这是有道理的。
  • 它在 Swift 中的工作方式是 Swift == 默认为 isEqual;但在 Objective-C / Cocoa 中,isEqual 默认为对象相等,这就是=== 的含义。但是不应该依赖诡计;编写代码的方法是说出你的意思。如果您的意思是“平等”,请使用==。如果您的意思是“完全相同的对象”,请使用===
【解决方案2】:

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

当您使用== 比较两个不同的个体实例UIView(具有不同的值)时,将始终返回false,除非您符合Equatable 协议并提供自定义相等标准。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2010-10-14
    • 2022-11-13
    • 1970-01-01
    • 2012-10-19
    • 2018-06-09
    相关资源
    最近更新 更多