我正在尝试使用引用比较(===
)比较两种协议类型.我什么时候得到(Foo
协议在哪里):
Binary operator '===' cannot be applied to two 'Foo' operands
我理解为什么==
不符合要求就行不通Equatable
,但在这种情况下我正在使用===
,这只是一个地址比较.
让我们在声明中显示问题:
该===
运营商的申报AnyObject
.
public func ===(lhs: AnyObject?, rhs: AnyObject?) -> Bool
到底是AnyObject
什么?AnyObject
是一个所有类自动符合的协议.
在Swift中,不仅有类类型,还有值类型,例如结构和枚举.所有这些都符合协议,但结构和枚举不符合AnyObject
.由于您具有Java背景,因此值类型的行为类似于Java中的基本类型 - 它们通过值(复制)传递,并且您通常不会获得对它们的引用.
当您声明协议时,编译器不知道它是否将被类或结构采用.
protocol X {} struct A: X {} let x1: X = A() let x2: X = A() // PROBLEM - we cannot compare two structs by === if x1 === x2 { }
这意味着我们必须告诉编译器该协议只能由类采用:
protocol X: AnyObject {}
要么
protocol X: class {}
然后
class A: X {} // can be adopted only by classes let x1: X = A() let x2: X = A() // NO problem if x1 === x2 { }