二进制运算符'!=='不能应用于两个'MyProtocol'

时间:2018-11-06 15:02:47

标签: swift swift-protocols

我已经创建了一个协议:

ObjectResult<T>

然后,我有一个数组,用于存储类型为public protocol MyProtocol { func doTask() } 的元素:

MyProtocol

呼叫者可以将元素添加到taskList,最终,我得到一个非空的var taskList: [MyProtocol] = []

现在,我需要一个可以从taskList中删除元素的函数,这就是我尝试的方法:

taskList

但是我收到编译器错误:func removeTask(task: MyProtocol) { // Compiler error: Binary operator '!==' cannot be applied to two 'MyProtocol' taskList = taskList.filter{$0 !== task} }

如何摆脱这个错误?

===更新===

感谢@holex,将Binary operator '!==' cannot be applied to two 'MyProtocol'更改为仅类之后,它可以正常工作。但是,现在我想知道是否需要MyProtocol不只限于类,那么解决方案是什么?

1 个答案:

答案 0 :(得分:6)

您正在使用!==来比较参考。您无法使用此运算符直接比较protocol,因为MyProtocol可以成为classstruct。由于!==只能比较实例,因此您必须明确声明protocolclass

请将MyProtocol更改为以下内容,这应该可以解决您的问题:

protocol MyProtocol: class { // AnyObject can be used here as well
    func doTask()
}

在没有classAnyObject的情况下尝试执行此操作不适用于您当前的设计。您可能想要实现另一种比较方法。

还请注意,您可以尝试使用!=来完成完全相同的操作。使用这种方式,您不必声明classAnyObject。因此,请检查是否适合您。