Error[8]: Undefined offset: 6, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我一直在与 Swift上的一些关于泛型的问题进行斗争,我找不到如何实现这个目标的方法: >我有一个班级商店< S:State>其中State是一个简单的协议,它扩展了Equatable协议状态:Equatable. >我有一个类Logger,我想在其中存储一系列商店以跟踪它们的每个变化,并将它们的状态与旧值进行比较,从而能够检查每次迭代中的哪些变化. 为此,我需要在我的记录器类中存储Any Kin 我一直在与 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]数组时,我检索到下一个错误:
协议“存储”只能用作通用约束,因为它具有自身或相关类型要求

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

您可以将自己的@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:等价泛型类型的数组所遇到的程序开发问题。

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

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
ios – Swift:等价泛型类型的数组_app_内存溢出

ios – Swift:等价泛型类型的数组

ios – Swift:等价泛型类型的数组,第1张

概述我一直在与 Swift上的一些关于泛型的问题进行斗争,我找不到如何实现这个目标的方法: >我有一个班级商店< S:State>其中State是一个简单的协议,它扩展了Equatable协议状态:Equatable. >我有一个类Logger,我想在其中存储一系列商店以跟踪它们的每个变化,并将它们的状态与旧值进行比较,从而能够检查每次迭代中的哪些变化. 为此,我需要在我的记录器类中存储Any Kin 我一直在与 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]数组时,我检索到下一个错误:
协议“存储”只能用作通用约束,因为它具有自身或相关类型要求

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

您可以将自己的@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:等价泛型类型的数组所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1033238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存