Swift протокол делегата для универсального класса

У меня есть класс,StateMachine, что является общим для реализации различных наборов состояний, таких как, например, перечисление. Я хочу использоватьStateMachineDelegate протокол для уведомления делегата, когда конечный автомат входит в новое состояние.

Но это не работает, поскольку протокол делегата также является общим с требованиями к типу. Ошибка показывает, гдеdelegate собственность объявлена.

protocol StateType: Hashable {}

protocol StateMachineDelegate: class {
    typealias S: StateType
    func stateMachine(stateMachine: StateMachine<S>, didEnterState newState: S)
}

class StateMachine<S: StateType> {
    typealias State = S

    weak var delegate: StateMachineDelegate?
    //~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
    //Protocol 'StateMachineDelegate' can only be used as a generic constraint because it has Self or associated type requirements

    var currentState: State {...}

    init(initialState: State) {...}

    func applyState(toState: State) -> Bool {
        ...
        currentState = toState
        delegate?.stateMachine(self, didEnterState: toState)
        ...
    }
}



Мне нужно как-то связать этоStateMachineDelegate.S == S вStateMachine класс, но я не уверен, как это сделать, или если это возможно. Я старался:

class StateMachine<S: StateType, D: StateMachineDelegate where D.S == S> {
    ...
    weak var delegate: D?
    ...
}

но затем я застреваю, пытаясь переработать протокол, чтобы правильно объявить универсальный типStateMachine, И кажется неправильным объявлять тип делегата заранее при созданииStateMachine.

Ответы на вопрос(0)

Ваш ответ на вопрос