Что мы создадим
В этой статье я покажу вам шаблон, который использую во всех своих проектах на Kotlin Multiplatform (KMP). Мы построим безопасный слой взаимодействия, который соединяет функции suspend и типы Flow языка Kotlin с моделью строгого параллелизма Swift 6.
К концу руководства у вас будут три повторно используемых шаблона:
- Обертка проверенных продолжений для функций
suspend - Адаптеры типа
AsyncStreamдля потоков данныхFlow - Репозиторий, изолированный через актор, объединяющий все компоненты
Предварительные условия
Для выполнения данного руководства необходимо следующее:
- Проект на Kotlin Multiplatform с экспортом общего модуля на платформу iOS
- Включена проверка строгой модели параллелизма в Swift 6
- Знакомство с корутинами Kotlin (
suspend,Flow) и асинхронным программированием в Swift (async/await)
Проблема в одной таблице
Когда вы экспортируете API Kotlin в Swift, генерируемый мост Objective-C вступает в конфликт со строгими правилами безопасности от гонок данных в Swift 6. Вот как это выглядит:
| Экспорт KMP | Проблема в Swift 6 | Степень тяжести | Паттерн решения |
|---|---|---|---|
suspend fun | Завершающий обработчик не помечен как @Sendable | Ошибка сборки | Проверенная обертка продолжения |
Flow<T> | Нет соответствия типу AsyncSequence | Ошибка сборки | Адаптер AsyncStream |
data class | Не является типом Sendable | Предупреждение → ошибка | Изоляция через акторы или использование аннотации @unchecked Sendable |
| Совместно используемое изменяемое состояние | Несовместимость изоляции глобального актора | Ошибка сборки | Репозиторий, изолированный через актор |
| Основанные на обратных вызовах API | Требования к замыканиям @Sendable | Ошибка сборки | Использование метода withCheckedContinuation |
На практике большинство усилий при миграции приложений KMP под Swift 6 приходится именно на этот уровень взаимодействия, а не на чистый код Swift.