具有关联类型的协议。如何避免在协议的所有实现上手动分配类型

时间:2019-01-12 11:19:01

标签: ios swift generics redux

我正在做自己的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。视图是触发操作的视图,应处理这些操作以改变一个或多个状态。仍然在开始时说明的“技术”问题可能会有解决方案。

1 个答案:

答案 0 :(得分:0)

您需要一个默认类型。然后,所有实现的结构/类的类型都将相同。

protocol State {
    associatedtype ActionType: StateAction = BoxState.Action
}