我创建了一个协议(protocol):

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{$0 !== task}
}

但我收到编译器错误:Binary operator '!==' cannot be applied to two 'MyProtocol'
如何摆脱这个错误?

=== 更新 ===

谢谢@holex,在将 MyProtocol 更改为仅限类后,它工作正常。但现在我想知道我是否需要 MyProtocol 不只是类,那么解决方案是什么?

最佳答案

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

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

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

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

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

关于swift - 二元运算符 '!==' 不能应用于两个 'MyProtocol',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53174519/

10-10 14:35