iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – Swift:等价泛型类型的数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在与 Swift上的一些关于泛型的问题进行斗争,我找不到如何实现这个目标的方法

>我有一个班级商店< S:State>其中State是一个简单的协议,它扩展了Equatable协议状态:Equatable.
>我有一个类Logger,我想在其中存储一系列商店以跟踪它们的每个变化,并将它们的状态与旧值进行比较,从而能够检查每次迭代中的哪些变化.

为此,我需要在我的记录器类中存储Any Kind of Store的数组.当我尝试使用val storeArray = [Store< Any>]时出现问题,它不起作用,因为Any不是Equatable类型,我将需要它们来扩展Equatable或NSObject以便能够比较两者之间的状态他们.

有可能在Swift中实现这一点吗?或者找出另一种方法来比较2个项目,而不是通用扩展Equatable协议?

如果你想检查实现:

州:

protocol State: Equatable {
}

商店:

class Store<S: State> {

    private var _initialState: S
    private var _state: S
    private var processor = PublishSubject<S>()

    init(initialState: S) {
        _initialState = initialState
        _state = initialState
    }

    var state: S {
        get {
            return _state
        }
        set(value) {
            if (value != state) {
                _state = value
                processor.onNext(value)
            }
        }
    }

    func initialState() -> S {
        return _initialState
    }

    /// Initialize the store. Called after all stores instances are ready.
    func initialize() {
        //TODO Check if its possible to force an override over a method
        preconditionFailure("This method must be overridden")
    }
}

在Vadian的建议之后,我试图将其移动到具有关联类型的协议:

protocol Store: class {
    associatedtype State : StateDelegate
    var processor : PublishSubject<State> { get }
    var _state : State { get set }
    var state: State { get set }
    func initialState() -> State
    func flowable() -> Observable<State>
    func initialize() -> Void
}

extension Store {

    var state: State {
        get {
            return _state
        }
        set(value) {
            if (value != state) {
                _state = value
                processor.onNext(value)
            }
        }
    }

    func flowable() -> Observable<State> {
        return processor.startWith(state)
    }

    func initialState() -> State {
        return State.init()
    }
}

但是当我尝试创建[Store]数组时,我检索到下一个错误
协议“存储”只能用作通用约束,因为它具有自身或相关类型要求

解决方法

我想我现在明白你的问题.这个解决方案怎么样:

您可以将自己的自定义相等检查添加到协议中,而不是让State符合Equatable;这样你就可以将状态存储在一个数组中(var states:[State]).缺点是您不能使用泛型,而是必须键入代码检查,就像过去一样.

例如,State协议的简单版本:

protocol State {
  func isEqualTo(_ other: State) -> Bool
}

您的具体状态类型必须实现isEqualTo并在测试相等性之前执行类型检查:

struct State1: State {
  var foo: String
  func isEqualTo(_ other: State) -> Bool {
    guard let state1 = other as? State1 else { return false }
    return self.foo == state1.foo
  }
}

现在,您可以将状态存储在数组中,例如检查是否已包含新状态:

let states: [State] = [ State1(foo: "hi"),State2(bar: 42),State1(foo: "bye")]
let newState = State2(bar: 42)
let containsNewState = states.contains { $0.isEqualTo(newState )}

大佬总结

以上是大佬教程为你收集整理的ios – Swift:等价泛型类型的数组全部内容,希望文章能够帮你解决ios – Swift:等价泛型类型的数组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: