代码之家  ›  专栏  ›  技术社区  ›  J. Doe

swift中的观察者模式及其默认实现

  •  0
  • J. Doe  · 技术社区  · 6 年前

    这是我的代码:

    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 后缀。但是,我可以通过添加 : AnyObject 后面 associatedtype T ,但是我不能创建一个协议和一个编译类(我得到了一个错误,说协议不符合 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 }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Rob Napier    6 年前

    你相信 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] = []
    }