我正在做自己的Redux / Flux轻松实现,并且正在尝试对一些数据结构进行建模。
基本上,我有一个状态协议,可以有一个关联的类型动作。
protocol State {
associatedtype ActionType: StateAction
}
然后我将状态定义为:
struct BoxState: State {
typealias ActionType = Action
var boxes:[Box]
}
extension BoxState {
enum Action: StateAction {
case select(String)
case reshape(String, CGRect)
case delete(String)
case add(CGPoint)
}
}
我对此不满意的是,即使每个枚举都具有相同的类型,我也必须为协议的每个实现定义associatedtype
。
1-是否有一种方法可以强制每个国家实施都具有枚举类型Action
?我知道Action
实际上是BoxState.Action
类型的,但是也许有一种更好的抽象方法。
编辑:大的解释,不需要上面的问题,但可以作为解释: 我开始做一个简单的Redux实现,因为我喜欢reducer函数和视图对状态的反应。
如此处建议,如此处建议,商店应该调度动作。 到目前为止,这是我非常粗糙的实现:
protocol StateAction {}
protocol State {
associatedtype ActionType: StateAction
}
protocol Dispatcher {
associatedtype Action: StateAction
func dispatch(_ action: Action)
}
class StateStore<Type: State>: Dispatcher {
typealias Action = Type.ActionType
private var subscribers:[(Type)->()] = []
var onDispatch:((Action)->())?
var state: Type! {
didSet {
self.didUpdateState(state)
}
}
func didUpdateState(_ state: Type) {
self.subscribers.forEach { $0(state) }
}
func addSubscriber(_ subscriber: @escaping (Type)->()) {
self.subscribers.append(subscriber)
}
func dispatch(_ action: Action) {
self.onDispatch?(action)
}
}
我认为错误的是State
正在定义Action
。视图是触发操作的视图,应处理这些操作以改变一个或多个状态。仍然在开始时说明的“技术”问题可能会有解决方案。
答案 0 :(得分:0)
您需要一个默认类型。然后,所有实现的结构/类的类型都将相同。
protocol State {
associatedtype ActionType: StateAction = BoxState.Action
}