gpt4 book ai didi

swift - 带有默认实现的 swift 中的观察者模式

转载 作者:行者123 更新时间:2023-11-28 14:24:49 24 4
gpt4 key购买 nike

这是我的代码:

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)
}
}

我收到一个错误提示

Binary operator '!==' cannot be applied to operands of type '_' and 'Self.T'

我不确定它想告诉我什么。我可以毫无问题地添加观察者 .self 后缀。但是,我可以通过在 associatedtype T 后面添加 : AnyObject 来消除编译错误,但是我无法创建一个协议(protocol)和一个可以编译的类(我有错误说协议(protocol)不符合AnyObject,不管我在协议(protocol)后面加: AnyObject)

有什么方法可以创建一个带有协议(protocol)和默认实现的观察者模式,它可以编译并且我可以使用(创建协议(protocol)和类:))。

编辑:观察者也是一个协议(protocol),而不是一个类。

编辑 2:这有效(但我必须始终重新实现 addObserver 方法)

public protocol MyProtocol: AnyObject {}

public class MyClass: Subjectable {
public var observers = [MyProtocol]()

public func removeObserver(_ observer: MyProtocol) {
observers = observers.filter { $0 === observer }
}
}

最佳答案

您认为 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] = []
}

关于swift - 带有默认实现的 swift 中的观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51698422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com