Общие типы в Swift 6+ с протоколами и структурамиIOS

Программируем под IOS
Ответить
Anonymous
 Общие типы в Swift 6+ с протоколами и структурами

Сообщение Anonymous »

Исходя из Android и Kotlin, я пытаюсь адаптировать свое приложение для Android к iOS, для которого у меня нет никакого опыта разработки.
Мое приложение использует шаблон конечного автомата для обработки пользовательского интерфейса и событий пользовательского интерфейса (либо из пользовательского интерфейса, либо из уровня домена).
Этот шаблон включает в себя общие типы с протоколами и структурами с несколькими уровнями наследования, и его очень сложно заставить работать.

Вот что у меня есть в 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)
}
}
Я пробовал адаптировать его в Swift, но безуспешно:

Код: Выделить всё

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)
}
}
Среда IDE жалуется на RetryHomeUiAction:

Тип «RetryHomeUiAction» не соответствует протоколу «HomeUiAction»
Тип по умолчанию «любой HomeUiEventHandler» для связанного типа «Handler» (из протокола «HomeUiAction») не соответствует 'UiEventHandler'

Поскольку проект и цели используют Swift 6+, я также пробовал использовать первичное ассоциированное выражение типа замыкания, но тоже безрезультатно (некоторая ошибка говорит: «требуется протокол со связанными типами»?)
Где я делаю что-то неправильно? Спасибо за помощь!
  • РЕДАКТИРОВАНИЕ 1: обновлен код после предложений @sweeper в комментариях.


Подробнее здесь: https://stackoverflow.com/questions/798 ... nd-structs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»