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
.