|
2 | 2 | sidebar_position: 2 |
3 | 3 | --- |
4 | 4 |
|
5 | | -# Особенности KMM |
| 5 | +# Особенности KMP |
6 | 6 |
|
7 | | -Что следует учитывать при разработке с использованием Kotlin Multiplatform Mobile: |
| 7 | +Что следует учитывать при разработке с использованием Kotlin Multiplatform: |
8 | 8 | - `inline`/`value` классы в iOS попадают в виде тех типов, которые оборачивают. то есть `inline class DateTime(val date: String)` в iOS будет просто `String` |
| 9 | +- Начиная с Kotlin 2.0 используется **K2 компилятор**, который даёт двукратное ускорение сборки, улучшенный smart-cast и единый компилятор для всех платформ |
| 10 | +- **SKIE** — плагин компилятора от Touchlab, автоматически конвертирует Kotlin Flow в Swift AsyncSequence, а suspend-функции — в async/await, без ручного кода на iOS-стороне |
9 | 11 |
|
10 | | -## Kotlin vs Swift - в чем разница |
| 12 | +## Kotlin vs Swift — в чем разница |
11 | 13 |
|
12 | | -1. В котлине есть [анонимные](https://kotlinlang.org/docs/nested-classes.html#anonymous-inner-classes) классы, которые позволяют без создания отдельного именованного класса реализовать интерфейс например; |
13 | | - 1. анонимные классы пришли из Java и подробнее разобраны [тут](https://javarush.ru/groups/posts/2193-anonimnihe-klassih) в контексте Java. |
14 | | -2. Сравнение языков на примерах: |
15 | | - 1. <https://habr.com/ru/post/350746/>; |
16 | | - 2. <https://www.raywenderlich.com/6754-a-comparison-of-swift-and-kotlin-languages>; |
17 | | - 3. <https://levelup.gitconnected.com/swift-vs-kotlin-which-is-better-696222a49a34>; |
18 | | - 4. <https://medium.com/@anios4991/swift-vs-kotlin-the-differences-that-matter-80a46090d9c6>. |
19 | | -3. [Разница конструкторов классов](https://medium.com/mobile-app-development-publication/kotlin-vs-swift-the-init-construction-f82224a24664); |
20 | | -4. Разница extensions - [раз](../kotlin-native/swift-extensions), [два](https://medium.com/mobile-app-development-publication/kotlin-vs-swift-the-extension-5462b531260b); |
21 | | -5. [Абстрактные классы](https://medium.com/mobile-app-development-publication/kotlin-vs-swift-the-abstract-class-f8817e5e54f). |
| 14 | +1. В котлине есть [анонимные](https://kotlinlang.org/docs/nested-classes.html#anonymous-inner-classes) классы, которые позволяют без создания отдельного именованного класса реализовать интерфейс или абстрактный класс; |
| 15 | +2. [Kotlin for Swift developers](https://kotlinlang.org/docs/swift-overview.html) — официальное руководство по различиям в типах, конструкторах, extension, протоколах и т.д.; |
| 16 | +3. Разница extensions — [раз](../kotlin-native/swift-extensions), [два](https://kotlinlang.org/docs/swift-overview.html#extensions); |
| 17 | +4. [Sealed class vs Swift enum](https://kotlinlang.org/docs/swift-overview.html#sealed-classes). |
22 | 18 |
|
23 | 19 | ## Конфликты имен на iOS |
24 | 20 |
|
25 | | -- В iOS у всех объектов есть поле `description` (работает также как Kotlin `toString`) и поэтому при использовании в Kotlin свойств с таким названием будет появляться в iOS дополнительное поле `_description` - которое и будет свойством от Kotlin |
| 21 | +- В iOS у всех объектов есть поле `description` (работает как Kotlin `toString`) и поэтому при использовании в Kotlin свойств с таким названием в iOS будет появляться дополнительное поле `_description` - которое и будет свойством от Kotlin |
26 | 22 |
|
27 | | -Следующий набор имен на iOS будет конфликтовать либо между собой либо с iOS сигнатурами: |
| 23 | +Следующий набор имен на iOS будет конфликтовать либо между собой, либо с iOS сигнатурами: |
28 | 24 | - State (в SwiftUI используется) |
29 | 25 | - ключевые слова swift'а |
30 | 26 |
|
31 | 27 | (!) Если у объекта есть функция и переменная с одинаковым именованием, то Swift будет видеть только последнюю из объявленных. |
32 | 28 |
|
33 | | -## Полезные вопросы на подумать из kotlinlang.slack |
| 29 | +> SKIE частично решает эти проблемы, генерируя Swift-обёртки с корректными именами. |
34 | 30 |
|
35 | | -- How can I transform from a flow to a publisher? |
36 | | - - https://johnoreilly.dev/posts/kotlinmultiplatform-swift-combine_publisher-flow/ |
37 | | -- What strategy do we have to marry the reactive code that android devs write with the imperative code the iOS devs write? |
38 | | -- Which layers do we move to shared and which don't we? |
39 | | -- How do we expose our shared lib to iOS and Android? |
| 31 | +## SKIE — Swift-friendly API из коробки |
40 | 32 |
|
41 | | -<https://youtu.be/5QPPZV04-50> - запись с Kotlin 1.4 online event про мпп детали |
| 33 | +[SKIE](https://skie.touchlab.co/) — плагин компилятора Kotlin/Native, который модифицирует экспортируемый Xcode Framework, добавляя Swift-обёртки: |
| 34 | + |
| 35 | +- **Flow → AsyncSequence**: любой `Flow<T>` автоматически доступен в Swift как `AsyncSequence` с сохранением типа `T` |
| 36 | +- **suspend → async/await**: suspend-функции вызываются из Swift как нативные async-функции с двухсторонней отменой |
| 37 | +- **Combine Publisher** (preview): `toPublisher()` для интеграции с Combine |
| 38 | +- **Default arguments**: bridge default-значений аргументов в отдельные Swift-функции |
| 39 | +- **Enum cases**: Kotlin enum-ы экспортируются как Swift enum-ы, а не как class-ы |
| 40 | + |
| 41 | +Подключение — добавление плагина в `build.gradle.kts`: |
| 42 | + |
| 43 | +```kotlin |
| 44 | +plugins { |
| 45 | + id("co.touchlab.skie") version "0.10.10" |
| 46 | +} |
| 47 | +``` |
| 48 | + |
| 49 | +## Compose Multiplatform |
| 50 | + |
| 51 | +[Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform) — UI-фреймворк от JetBrains на основе Jetpack Compose: |
| 52 | + |
| 53 | +- **iOS — Stable** с версии 1.8.0 (май 2025). Текущая версия — 1.11.0 (май 2026) |
| 54 | +- Поддержка всех платформ: Android, iOS, Desktop (macOS/Windows/Linux), Web (Wasm, Beta) |
| 55 | +- **Compose Hot Reload** — мгновенное обновление UI при изменении кода без потери состояния (стабильно с 1.10.0) |
| 56 | +- Навигация, Material 3, lifecycle, saved state — всё доступно в commonMain |
| 57 | +- Размер приложения для iOS: + ~9 МБ относительно чистого SwiftUI |
| 58 | + |
| 59 | +## K2 компилятор |
| 60 | + |
| 61 | +Kotlin 2.0 (май 2024) представил новый [K2 компилятор](https://kotlinlang.org/docs/k2-compiler-migration-guide.html): |
| 62 | + |
| 63 | +- Ускоряет компиляцию KMP-проектов до 2× |
| 64 | +- Улучшает smart-cast и inference типов |
| 65 | +- Единый compiler plugin API для всех платформ |
| 66 | +- Compose compiler встроен в Kotlin — не требует отдельной версии |
| 67 | + |
| 68 | +С IntelliJ IDEA 2025.1 K2 mode включён по умолчанию. |
| 69 | + |
| 70 | +## Инструменты |
| 71 | + |
| 72 | +- **KMP plugin** — новый плагин для IntelliJ IDEA и Android Studio (Beta, с мая 2025). Упрощает создание KMP-модулей, запуск на iOS, Compose Previews в commonMain |
| 73 | +- **Swift Export** (экспериментальный) — экспорт Kotlin напрямую в Swift, минуя Objective-C. Первый публичный релиз ожидается в Kotlin 2.2.20 |
| 74 | +- **KMP Wizard** — встроенный в IDE мастер создания KMP-проекта |
| 75 | + |
| 76 | +## Ключевые библиотеки |
| 77 | + |
| 78 | +| Библиотека | Назначение | |
| 79 | +|---|---| |
| 80 | +| [Ktor](https://ktor.io/) | HTTP-клиент и сервер | |
| 81 | +| [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) | Мультиплатформенная сериализация (JSON, ProtoBuf, CBOR) | |
| 82 | +| [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) | Асинхронность, Flow, каналы | |
| 83 | +| [SKIE](https://skie.touchlab.co/) | Swift-friendly API | |
| 84 | +| [SQLDelight](https://cashapp.github.io/sqldelight/) | Мультиплатформенная БД | |
| 85 | +| [moko libraries](https://github.com/icerockdev?q=moko) | MVVM, ресурсы, alerts, networking от IceRock | |
| 86 | + |
| 87 | +## Текущие ограничения |
| 88 | + |
| 89 | +Несмотря на зрелость, у KMP остаются проблемы, которые ещё не решены: |
| 90 | + |
| 91 | +- **Swift Export** (экспериментальный) — сейчас Kotlin экспортируется в Swift через Objective-C, что теряет многие возможности языка (enum как class, нет async/await из коробки, нет поддержки Swift-only API). Прямой экспорт в Swift решит эти проблемы, но пока не стабилен. Ожидание: стабильный релиз в Kotlin 2.2+ |
| 92 | +- **Скорость сборки iOS** — Kotlin/Native компилируется медленнее JVM. JetBrains активно оптимизирует это, но для больших проектов сборка iOS-таргета остаётся узким местом |
| 93 | +- **Отладка shared code на iOS** — брейкпоинты в общем коде не работают из Xcode. iOS-разработчикам приходится открывать IntelliJ IDEA для отладки shared-модуля |
| 94 | +- **Только ObjC interop** — из Kotlin нельзя вызвать Swift-only API (SwiftUI, protocol extensions, замыкания). Приходится писать ObjC-прослойки вручную |
| 95 | +- **Один framework на приложение** — Kotlin/Native генерирует единый framework для iOS, что мешает модульной архитектуре. Решение — в Swift Export и кастомной конфигурации |
| 96 | +- **Compose для Web — только Beta** — Kotlin/Wasm в стадии Beta, не готов к production для большинства сценариев |
0 commit comments