【问题标题】:Swift: binary operator '==' cannot be applied to operands of type "protocol"Swift:二元运算符“==”不能应用于“协议”类型的操作数
【发布时间】:2015-12-17 02:39:18
【问题描述】:

我有一个协议:

protocol ProfileManagerDelegete {
func dataHaveUpdated(type: ReturnType)

}

并创建一个协议数组,并添加/删除监听器:

var listeners: [ProfileManagerDelegete] = []

func addListener(listener: ProfileManagerDelegete) {
    listeners.append(listener)
}

func removeLister(listener: ProfileManagerDelegete) {
    for lis in listeners {
        if lis == listener { // this line error
            //remove listener
        }
    }
}

有人可以帮忙吗?

【问题讨论】:

  • 我对 swift 了解不多,但我猜想protocol 类型需要实现某种相等运算符,因为如果没有,你就不能这样做。

标签: swift protocols


【解决方案1】:

因为你还没有告诉 Swift 如何比较两个 ProfileManagerDelegete 类型的对象。定义一个函数:

protocol ProfileManagerDelegete {
    func dataHaveUpdated(type: ReturnType)
}

func == (lhs: ProfileManagerDelegete, rhs: ProfileManagerDelegete) -> Bool {
    // decide if they are equal
}

【讨论】:

  • 有趣。这足够了吗?我只是在查找 Equatable 协议并确保一个协议可以继承另一个协议。我打算建议 OP 必须将他的协议标记为从 Equatable 继承(以及编写此方法)。
  • 通过测试回答了我自己的问题。确实足够了。并且试图继承 Equatable 会导致很多问题。
  • @Just Another Coder,是的,你是对的,但是如果我把它放在协议中,我应该把“==”放在哪里。得到一个错误:协议方法可能没有主体
  • 您应该在协议之后定义== 函数,而不是在协议内部。请参阅我编辑的答案。
【解决方案2】:

在这种情况下,您想使用“===”运算符。只需让 ProfileManagerDelete 符合 AnyObject 即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多