Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift如何在泛型类中使用泛型协议_Ios_Swift - Fatal编程技术网

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一样工作