Мое приложение использует шаблон конечного автомата для обработки пользовательского интерфейса и событий пользовательского интерфейса (либо из пользовательского интерфейса, либо из уровня домена).
Этот шаблон включает в себя общие типы с протоколами и структурами с несколькими уровнями наследования, и его очень сложно заставить работать.
Вот что у меня есть в Kotlin для HomeScreen:
Код: Выделить всё
// Events
interface UiEvent
sealed interface HomeUiEvent : UiEvent {
data object Start : HomeUiEvent
data object Retry: HomeUiEvent
}
// Events Handler
fun interface UiEventHandler {
fun handleEvent(event: Event)
}
fun interface HomeUiEventHandler : UiEventHandler
sealed interface UiActionWithEventHandler {
val handler: Handler
}
Код: Выделить всё
sealed interface HomeUiAction : UiActionWithEventHandler {
data class Retry internal constructor(
override val handler: HomeUiEventHandler,
) : HomeUiAction {
fun trigger() = handler.handleEvent(event = HomeUiEvent.Retry)
}
}
Код: Выделить всё
protocol UiEvent {}
protocol UiEventHandler{
associatedtype Event: UiEvent
func handleUiEvent(uiEvent: Event)
}
enum HomeUiEvents: UiEvent {
case start
case retry
}
// Ensures the HomeUiEventHandler only consumes home-related UiEvents
protocol HomeUiEventHandler : UiEventHandler where Event == HomeUiEvents {}
// 2 generic types: the type of UI event and the type of handler to consume them
protocol UiActionWithEventHandler {
associatedtype Event: UiEvent
associatedtype Handler: UiEventHandler
var handler: Handler { get }
}
// Ensures all home-related UI actions triggers only home-related UI events to be dispatched to a reference to a UI handler capable of consuming such UI events
protocol HomeUiAction: UiActionWithEventHandler {
associatedtype Event = HomeUiEvents
associatedtype Handler = HomeUiEventHandler
}
struct RetryHomeUiAction: HomeUiAction {
private(set) var handler: any HomeUiEventHandler
init(handler: any HomeUiEventHandler) {
self.handler = handler
}
func trigger() {
handler.handleUiEvent(uiEvent: .retry)
}
}
Тип «RetryHomeUiAction» не соответствует протоколу «HomeUiAction»
Тип по умолчанию «любой HomeUiEventHandler» для связанного типа «Handler» (из протокола «HomeUiAction») не соответствует 'UiEventHandler'
Поскольку проект и цели используют Swift 6+, я также пробовал использовать первичное ассоциированное выражение типа замыкания, но тоже безрезультатно (некоторая ошибка говорит: «требуется протокол со связанными типами»?)
Где я делаю что-то неправильно? Спасибо за помощь!
- РЕДАКТИРОВАНИЕ 1: обновлен код после предложений @sweeper в комментариях.
Подробнее здесь: https://stackoverflow.com/questions/798 ... nd-structs
Мобильная версия