Общие типы в 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)
}

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

Тип «RetryHomeUiAction» не соответствует протоколу «HomeUiAction»
Тип по умолчанию «любой HomeUiEvent» для связанного типа «Событие» (из протокола «HomeUiAction») не соответствует «UiEvent»

Поскольку в проекте и целях используется Swift 6+, я также пробовал использовать первичное выражение, связанное с типом замыкания, но тоже безрезультатно.
Где я делаю что-то неправильно? Спасибо за помощь!

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

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

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

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

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

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