我在SWIFT中定义了以下协议:
protocol RecordingObserver {
func aFunc()
}
在某个地方,我必须比较实现此协议的两个对象,以检查它们是否相同。我面临的问题是,显然斯威夫特不允许我们这么做:
func areEqual(a:RecordingObserver,b:RecordingObserver){
if a === b {
println("Equal")
}
}
知道为什么会这样吗?我怎么能用另一种方式做到这一点?
最佳答案
===
与operator相同,用于测试两个对象引用是否都引用同一对象实例。它可以应用
仅限于引用类型(即class
的实例)。===
不同于“equal to”operator==
(这在Equatable
协议中是必需的)。
因此,假设
实际观察者是aclass
的实例,并且
您的目的是检查a
和b
是否引用相同的实例,
您必须将协议定义为类协议:
protocol RecordingObserver : class {
// ...
}
然后
func areEqual(a:RecordingObserver,b:RecordingObserver){
if a === b {
println("a and b refer to the same object instance")
}
}
编译(并按预期工作),因为编译器知道
a
和b
是引用类型。