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

Binary operator '!==' cannot be applied to two 'MyProtocol'

我创建了一个协议:

public protocol MyProtocol {
  func doTask()
}

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

var taskList: [MyProtocol] = []

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

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

func removeTask(task: MyProtocol) {
   // Compiler error: Binary operator '!==' cannot be applied to two 'MyProtocol'
   taskList = taskList.filter{[=13=] !== task}
}

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

如何摆脱这个错误?

===更新===

感谢@holex,将MyProtocol改为class-only后,效果很好。但是现在我想知道我是否需要 MyProtocol 而不是 class-only,那么解决方案是什么?

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

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

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

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

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