gpt4 book ai didi

协议(protocol) : operator '===' cannot be applied to operands of type '_' and 'Self.T' 中的 Swift 泛型

转载 作者:可可西里 更新时间:2023-11-01 01:36:54 25 4
gpt4 key购买 nike

我正在尝试使用 Swift 2 构建一个简单的观察者混合。这里只是相关部分。

protocol Observable{

typealias T
var observers:[T] { get set }
mutating func removeObserver(observer:T)
}

为了创建混入,我使用了一个扩展:

extension Observable{

mutating func removeObserver(observer:T){
let index = self.observers.indexOf{ $0 === observer }
if let _ = index{
self.observers.removeAtIndex(index)
}
}
}

这会产生编译器错误:二元运算符“===”不能应用于“_”和“Self.T”类型的操作数

你能解释一下为什么会出现这个错误吗?

最佳答案

“identical-to”运算符 === 只能应用于reference类型,即 class 的实例。一种可能的解决方案是将通用类型 T 限制为 AnyObject所有类都隐式符合):

protocol Observable {

typealias T : AnyObject
var observers:[T] { get set }
mutating func removeObserver(observer:T)
}

extension Observable {

mutating func removeObserver(observer:T) {
if let index = (self.observers.indexOf { $0 === observer }) {
self.observers.removeAtIndex(index)
}
}
}

或者,将 T 限制为 Equatable 类型(这意味着必须为类型定义 == 运算符):

protocol Observable {

typealias T : Equatable
var observers:[T] { get set }
mutating func removeObserver(observer:T)
}

extension Observable {

mutating func removeObserver(observer:T) {
if let index = self.observers.indexOf(observer) {
self.observers.removeAtIndex(index)
}
}
}

关于协议(protocol) : operator '===' cannot be applied to operands of type '_' and 'Self.T' 中的 Swift 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com