swift removeObject

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

Paste_Image.png

1、有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];
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容