Ios Swift如何在泛型类中使用泛型协议
我正在写一本国家管理图书馆。它基本上是一个简化的观察者模式,只有一个观察者/监听器 现在我有了这个,而且效果很好:Ios Swift如何在泛型类中使用泛型协议,ios,swift,Ios,Swift,我正在写一本国家管理图书馆。它基本上是一个简化的观察者模式,只有一个观察者/监听器 现在我有了这个,而且效果很好: public final class StateStore<S> { private var currentState: S public var listener: ((S) -> Void)? = nil public init(initialState: S) { currentState = initialState
public final class StateStore<S> {
private var currentState: S
public var listener: ((S) -> Void)? = nil
public init(initialState: S) {
currentState = initialState
}
func update(_ block: (inout S) -> Void) {
var nextState = currentState // struct's copy on write
block(&nextState)
currentState = nextState
listener?(currentState)
}
}
公共最终类状态存储{
私有变量当前状态:S
公共变量侦听器:((S)->Void)?=nil
公共初始化(初始状态:S){
当前状态=初始状态
}
func更新(u块:(inout S)->Void){
var nextState=currentState//struct写入时的副本
块(&nextState)
currentState=nextState
侦听器?(当前状态)
}
}
但是,我想将其更改为协议而不是块。比如:
public protocol StateListener: AnyObject {
associatedtype S
func didUpdateState(_ state: S)
}
public final class StateStore<S> {
...
public weak var listener: StateListener<S>? // <- how to deal with associate type
...
}
公共协议状态侦听器:AnyObject{
关联类型
func(州:S)
}
公共最终类状态存储{
...
public弱var-listener:StateListener?/S不是Swift风格;使用全文是现代标准
公共协议状态侦听器:AnyObject{
关联类型状态
func(州)
}
公共最终类状态存储{
公共弱var侦听器:侦听器?
}
您不需要手动计算关联类型。它是内置的,可以作为嵌套类型访问:
funcƒ(u:Listener.State){
}
S不是Swift风格;使用完整的文字是现代标准
公共协议状态侦听器:AnyObject{
关联类型状态
func(州)
}
公共最终类状态存储{
公共弱var侦听器:侦听器?
}
您不需要手动计算关联类型。它是内置的,可以作为嵌套类型访问:
funcƒ(u:Listener.State){
}
关键是使用侦听器
类型而不是S
类型来参数化状态存储
。S
然后可以定义为侦听器.S
的类型别名:
public final class StateStore<Listener: StateListener> {
public typealias S = Listener.S
关键是使用Listener
类型而不是S
类型参数化StateStore
。S
可以定义为Listener.S
的类型别名:
public final class StateStore<Listener: StateListener> {
public typealias S = Listener.S
为什么要使用协议进行此操作?它对我来说似乎不太灵活…@Sweeper,因为侦听器块通常很大,所以我最终执行了store.listener={weakSelf?.aHugeFunction()}
一直以来,你为什么要使用协议来实现这一点?对我来说,它似乎不够灵活…@Sweeper因为侦听器块通常很大,所以我最终做了store.listener={weakSelf?.aHugeFunction()}
一直像一个charm一样工作