Мое приложение использует шаблон конечного автомата для обработки пользовательского интерфейса и событий пользовательского интерфейса (либо из пользовательского интерфейса, либо из уровня домена).
Этот шаблон включает в себя общие типы с протоколами и структурами с несколькими уровнями наследования, и его очень сложно заставить работать.
Вот что у меня есть в 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)
}
protocol HomeUiEvent: UiEvent {}
enum HomeUiEvents: HomeUiEvent {
case start
case retry
}
protocol UiActionWithEventHandler {
associatedtype Event: UiEvent
var handler: any UiEventHandler { get }
}
protocol HomeUiAction: UiActionWithEventHandler {
associatedtype Event = HomeUiEvent
}
struct RetryHomeUiAction: HomeUiAction { // ERROR
private(set) var handler: HomeUiEventHandler
init(handler: HomeUiEventHandler) {
self.handler = handler
}
func trigger() {
handler.handle(HomeUiEvents.retry)
}
}
Тип «RetryHomeUiAction» не соответствует протоколу «HomeUiAction»
Тип по умолчанию «любой HomeUiEvent» для связанного типа «Событие» (из протокола «HomeUiAction») не соответствует «UiEvent»
Поскольку в проекте и целях используется Swift 6+, я также пробовал использовать первичное выражение, связанное с типом замыкания, но тоже безрезультатно.
Где я делаю что-то неправильно? Спасибо за помощь!
Подробнее здесь: https://stackoverflow.com/questions/798 ... nd-structs
Мобильная версия