我最近几天一直在处理Swift中有关泛型的问题,但我找不到解决方法来实现以下内容:
- 我有一个类
class Store<S: State>
,其中State
是一个简单的协议,它扩展了Equatableprotocol State: Equatable
。 - 我有一个类
Logger
,我想存储一个Stores
数组,以跟踪每个更改并比较它们的State
与旧值,能够检查每个迭代中发生了什么更改。
为此,我需要在我的日志记录器类中存储任何类型的Store数组。当我尝试使用val storeArray = [Store<Any>]
时,问题出现了,因为Any不是Equatable
类型,我将需要让它们扩展Equatable
或NSObject
以能够在它们之间比较状态。
在Swift中是否可能实现这一点?或者找到另一种方法来比较2个项目而不使泛型扩展Equatable
协议?
如果您想要查看实现:
State:
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]
数组时,会出现以下错误:协议 'Store' 只能用作泛型约束,因为它具有 Self 或关联类型的要求
State
类型(例如storeArray = [Store<State1>(), Store<State2>()]
)?如果是这样,那么Equatable
无论如何都不起作用,因为它要求两个比较的对象是相同类型的(或多或少)。 - dr_bartoStore
,但是当我尝试使用该类型的数组时,我收到了以下错误提示:Protocol 'Store' can only be used as a generic constraint because it has Self or associated type requirements
。 - Francisco Durdin GarciaStores
的States
,但我需要通用数组来迭代,有什么想法吗? - Francisco Durdin Garcia