我有两个AnyObject?
变量,我想比较引用相等性:
var oldValue: AnyObject?
var newValue: AnyObject?
...
if oldValue != newValue {
changed = true
}
但是这并不起作用,因为我显然不能直接比较两个选项。我想要的行为就像我在Objective-C中比较id
一样,即:
true
,如果两者都是nil
true
,如果两者都有值,并且值也相等false
否则
有没有一种优雅的方法可以在Swift中编写这个代码(理想情况下无需编写自定义扩展)?
这是我想到的最好的:
if !(oldValue != nil && newValue != nil && oldValue == newValue)
不是很漂亮。:(
6条答案
按热度按时间mzillmmw1#
假设你正在使用Comparable实体,这将适用于任何东西:
它并不完全简短和甜蜜,但它富有表现力,清晰,可重用。
izj3ouym2#
您可以使用
!==
Swift编程语言(Swift Programming Language)
Swift还提供了两个恒等运算符(
===
和!==
),用于测试两个对象引用是否都引用同一个对象示例。Difference between == and ===上也有一些很好的示例和解释
在@PEEJWEEJ点,执行以下操作将得到
false
wz8daaqr3#
我喜欢@基思的解决方案。但我认为它不是用Swift 4写的,因为我不能用Swift 4编译器编译它。
所以我把他的代码转换成Swift 4版本。
请记住,如果您使用的是比Swift 4.1更高版本的Swift语言,那么这个答案是没有必要的,因为它默认提供此功能。您可以参考here了解更多详细信息。
Swift 4版本@基思的代码:
ohfgkhjo4#
我定义了一个自定义中缀运算符,它带有一个用于引用类型和值类型的函数。
rxztt3cl5#
可以为某些
Comparable
类型重载==
运算符或者对
AnyObject
使用===
比较,不过,我个人更倾向于首先不使用AnyObject
。wko9yo5t6#
我相信这是基思的旧解决方案的Swift 5版本然而这是泛型。例如,如果您正在比较的对象是
String?
,它将认为String? = nil
与String? = ""
不相同,尽管两者在语义级别上都是“空”的