这是我的代码:
public protocol Subjectable: class {
associatedtype T
var observers: [T] { get set }
func addObserver(_ observer: T)
func removeObserver(_ observer: T)
func removeAllObservers()
}
public extension Subjectable {
func removeAllObservers() {
observers.removeAll()
}
func removeObserver(_ observer: T) {
observers = observers.filter { $0 !== observer.self } // error
}
func addObserver(_ observer: T) {
observers.append(observer.self)
}
}
我说错了
二进制运算符'!=='不能应用于类型'_'的操作数,并且 “ Self.T”
我不确定它想告诉我什么。我可以添加后缀.self
没有问题的观察者。但是,我可以通过在: AnyObject
之后添加associatedtype T
来摆脱编译错误,但是我无法创建协议和要编译的类(我得到了错误,指出协议不符合{{1 }},无论我是否在协议后面添加AnyObject
有什么方法可以创建带有协议和默认实现的观察者模式,这些协议可以进行编译并且可以使用(创建协议和类:))。
编辑:观察者也是协议,而不是类。
编辑2:这可行(但是我必须一直重新实现addObserver方法)
: AnyObject
答案 0 :(得分:1)
您认为T
必须是一类(AnyObject
)是正确的。您无需在此处的任何地方使用.self
。
public protocol Subjectable: class {
associatedtype T: AnyObject // Require T to be a class type for !==
// ...
}
public extension Subjectable {
// ...
func removeObserver(_ observer: T) {
observers = observers.filter { $0 !== observer } // Remove .self
}
func addObserver(_ observer: T) {
observers.append(observer) // Remove .self
}
}
然后您可以使用默认实现来实现它:
class O {}
class X: Subjectable {
var observers: [O] = []
}