>我有一个班级商店< 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]数组时,我检索到下一个错误:
协议“存储”只能用作通用约束,因为它具有自身或相关类型要求
您可以将自己的@R_419_6942@相等检查添加到协议中,而不是让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 { .isEqualTo(newState )}总结
以上是内存溢出为你收集整理的ios – Swift:等价泛型类型的数组全部内容,希望文章能够帮你解决ios – Swift:等价泛型类型的数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)