【发布时间】:2016-01-16 12:55:34
【问题描述】:
我正在尝试实现一个允许我存储一组弱观察者的结构。
这是观察者包装器:
public func ==<T: Hashable>(lhs: WeakObserver<T>, rhs: WeakObserver<T>) -> Bool {
return lhs.hashValue == rhs.hashValue
}
public struct WeakObserver<T where T: AnyObject, T: Hashable> : Hashable {
private weak var weakObserver : T?
public init(weakObserver: T){
self.weakObserver = weakObserver
}
public var hashValue : Int {
return self.weakObserver!.hashValue
}
}
这是每个观察者都需要遵守的协议:
public protocol DataModelObserverProtocol : class, Hashable, AnyObject {
func someFunc()
}
用法:
public class DataModel: NSObject, DataModelInterface {
public var observers = Set<WeakObserver<DataModelObserverProtocol>>()
//^^^^^ Using 'DataModelObserverProtocol' as a concrete type conforming to protocol 'AnyObject' is not supported
}
现在,虽然我知道这可能是 Swift 本身的限制,但我正在寻找一种没有具体类作为类型约束的替代解决方案(如果这不可能,恐怕就是这种情况,我d 仍然喜欢获得替代的“非 hacky”解决方案)。
【问题讨论】:
-
@Kirsteins 这看起来真的很像我要找的东西,但对我来说也有点矫枉过正(没有明显的原因)
-
@Kirsteins 即使使用了
WeakSet,我也会收到错误Using protocol as a concrete type conforming to protocol is not supported。 -
所以真的在寻找一种替代方法,因为协议不支持作为通用约束。
标签: swift generics observer-pattern weak-references