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

标签 swift swift-protocols

我已经创建了一个协议(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}
}

但我得到编译器错误:二元运算符 '!==' cannot be applied to two 'MyProtocol'

如何摆脱这个错误?

===更新===

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

最佳答案

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

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

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

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

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

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

相关文章:

ios - 从 NSDataAsset 读取时偶尔崩溃

iOS Facebook SDK 4 session

swift - 使用从另一个协议(protocol)继承或使用 where Self 声明 swift 协议(protocol)时的区别

swift - 类型 'Protocol' 的值没有成员 'Function'

swift - 在 Swift 中使属性符合类型并且也符合协议(protocol)

ios - 从 PHAsset 获取视频时如何检测视频是否为横向/纵向?

ios - UItableView 单元格第一行选择不起作用

swift - 为什么我必须以键值形式将参数传递给类?

swift - 如何断言结构符合协议(protocol)?

带有结构/协议(protocol)的 Swift 多态闭包分派(dispatch)