swift removeObject

今天在写swift实现的观察者模式时,遇到个问题,就是移除某个观察者,removeObserver(observer: IObserver),IObserver是个protocol。但在swift中并没有提供相关removeObject的方法,那该怎么办?

swift removeObject_第1张图片
Paste_Image.png

1、有removeAtIndex方法,尝试用indexOf(obj)得到index,然后移除掉。

swift removeObject_第2张图片
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)obj {
    [_observers removeObject:obj];
}

不知道还有没有更好的方法,欢迎提出来。

你可能感兴趣的:(swift removeObject)