带有默认实现的快速观察者模式

时间:2018-08-05 21:33:58

标签: swift protocols

这是我的代码:

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

1 个答案:

答案 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] = []
}