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

Lee*_*eem 4 swift swift-protocols

我创建了一个协议:

public protocol MyProtocol {
  func doTask()
}
Run Code Online (Sandbox Code Playgroud)

然后,我有一个MyProtocol类型为元素的数组:

var taskList: [MyProtocol] = []
Run Code Online (Sandbox Code Playgroud)

调用者可以向taskList添加元素,最终,我得到了一个非空的元素taskList.

现在,我需要一个可以删除元素的函数taskList,这是我尝试过的:

func removeTask(task: MyProtocol) {
   // Compiler error: Binary operator '!==' cannot be applied to two 'MyProtocol'
   taskList = taskList.filter{$0 !== task}
}
Run Code Online (Sandbox Code Playgroud)

但我收到编译器错误: Binary operator '!==' cannot be applied to two 'MyProtocol'

如何摆脱这个错误?

===更新===

谢谢@holex,在改成MyProtocol仅限课程后,它运作正常.但现在我想知道我是否需要MyProtocol不仅仅是课堂,那么解决方案是什么呢?

Gio*_*gen 6

您正在使用!==哪个比较参考.您无法protocol直接使用此运算符进行比较,因为MyProtocol可以成为classstruct.由于!==只能比较实例,因此必须明确声明您protocol是实例class.

请更改MyProtocol为以下内容,以解决您的问题:

protocol MyProtocol: class { // AnyObject can be used here as well
    func doTask()
}
Run Code Online (Sandbox Code Playgroud)

试图在没有classAnyObject不适用于您当前设计的情况下完成此任务.您可能想要实现另一种比较方法.

另请注意,您可以尝试使用!=哪些可能能够完成您想要的完全相同的操作.使用这种方式,您不必声明classAnyObject.所以检查一下是否适合你.