【发布时间】:2018-08-05 21:33:58
【问题描述】:
这是我的代码:
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)
}
}
我说错了
二元运算符“!==”不能应用于“_”类型的操作数和 '自我.T'
我不确定它想告诉我什么。我可以使用.self 后缀毫无问题地添加观察者。但是,我可以通过在associatedtype T 后面添加: AnyObject 来消除编译错误,但是我无法创建一个协议和一个可以编译的类(我收到错误说协议不符合AnyObject,不管我是否在协议后面加上: AnyObject)
有什么方法可以创建一个带有协议和默认实现的观察者模式,这些协议和默认实现可以编译并且我可以使用(创建协议和类:))。
编辑:观察者也是一个协议,而不是一个类。
编辑 2:这行得通(但我必须一直重新实现 addObserver 方法)
public protocol MyProtocol: AnyObject {}
public class MyClass: Subjectable {
public var observers = [MyProtocol]()
public func removeObserver(_ observer: MyProtocol) {
observers = observers.filter { $0 === observer }
}
}
【问题讨论】:
-
你的意思是
observers = observers.filter { $0 !== observer }? -
@Sweeper 我想使用 associatedtype 作为协议,而不是作为一个类。你知道结果如何吗?