今天在写swift实现的观察者模式时,遇到个问题,就是移除某个观察者,removeObserver(observer: IObserver),IObserver是个protocol。但在swift中并没有提供相关removeObject的方法,那该怎么办?
Paste_Image.png1、有removeAtIndex方法,尝试用indexOf(obj)得到index,然后移除掉。
Paste_Image.png可以看到需要实现Equatable
方法
2、使用filter
func removeObserver(observer: T) {
observers = observers.filter({ $0 != observer })
}
同样!=比较也是需要实现Equtable
协议的。
但是IObserver怎么实现呢?无奈,只有定义一个基类BaseObserver,来实现Equatable。并且以当前时间来hash,保证唯一性。
class BaseObserver: IObserver {
var value: Int = {
let now = NSDate()
let timeInterval = now.timeIntervalSince1970 * 100000
let interval: Int = Int(timeInterval)
print(interval)
return interval
}()
func update(subject: ISubject) {
fatalError("subclass should implement this method")
}
}
extension BaseObserver: Equatable {
}
func ==(lhs: BaseObserver, rhs: BaseObserver) -> Bool {
return lhs.value == rhs.value
}
如果是用OC的话,那就很简单了。可以直接使用IObserver接口类型。
- (void)removeObserver:(id<IObserver>)obj {
[_observers removeObject:obj];
}
不知道还有没有更好的方法,欢迎提出来。
网友评论