我在SWIFT中定义了以下协议:

protocol RecordingObserver {
    func aFunc()
}

在某个地方,我必须比较实现此协议的两个对象,以检查它们是否相同。我面临的问题是,显然斯威夫特不允许我们这么做:
func areEqual(a:RecordingObserver,b:RecordingObserver){
    if a === b {
        println("Equal")
    }
}

知道为什么会这样吗?我怎么能用另一种方式做到这一点?

最佳答案

===与operator相同,用于测试两个对象引用是否都引用同一对象实例。它可以应用
仅限于引用类型(即class的实例)。
===不同于“equal to”operator==(这在Equatable协议中是必需的)。
因此,假设
实际观察者是aclass的实例,并且
您的目的是检查ab是否引用相同的实例,
您必须将协议定义为类协议:

protocol RecordingObserver : class {
    // ...
}

然后
func areEqual(a:RecordingObserver,b:RecordingObserver){
    if a === b {
        println("a and b refer to the same object instance")
    }
}

编译(并按预期工作),因为编译器知道ab是引用类型。

10-08 12:13