当前位置:  开发笔记 > IOS > 正文

Swift - 二进制运算符'==='不能应用于两个协议

如何解决《Swift-二进制运算符'==='不能应用于两个协议》经验,为你挑选了1个好方法。

我正在尝试使用引用比较(===)比较两种协议类型.我什么时候得到(Foo协议在哪里):

Binary operator '===' cannot be applied to two 'Foo' operands

我理解为什么==不符合要求就行不通Equatable,但在这种情况下我正在使用===,这只是一个地址比较.



1> Sulthan..:

让我们在声明中显示问题:

===运营商的申报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 {
}

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有