Skip to content

Commit c31f72a

Browse files
authored
Merge pull request #173 from KuzminVik/kmm
Kmm
2 parents 19f74fb + 872a39f commit c31f72a

1 file changed

Lines changed: 77 additions & 22 deletions

File tree

learning/kotlin-multiplatform/mobile-highlights.md

Lines changed: 77 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,95 @@
22
sidebar_position: 2
33
---
44

5-
# Особенности KMM
5+
# Особенности KMP
66

7-
Что следует учитывать при разработке с использованием Kotlin Multiplatform Mobile:
7+
Что следует учитывать при разработке с использованием Kotlin Multiplatform:
88
- `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-стороне
911

10-
## Kotlin vs Swift - в чем разница
12+
## Kotlin vs Swift в чем разница
1113

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).
2218

2319
## Конфликты имен на iOS
2420

25-
- В iOS у всех объектов есть поле `description` (работает также как Kotlin `toString`) и поэтому при использовании в Kotlin свойств с таким названием будет появляться в iOS дополнительное поле `_description` - которое и будет свойством от Kotlin
21+
- В iOS у всех объектов есть поле `description` (работает как Kotlin `toString`) и поэтому при использовании в Kotlin свойств с таким названием в iOS будет появляться дополнительное поле `_description` - которое и будет свойством от Kotlin
2622

27-
Следующий набор имен на iOS будет конфликтовать либо между собой либо с iOS сигнатурами:
23+
Следующий набор имен на iOS будет конфликтовать либо между собой, либо с iOS сигнатурами:
2824
- State (в SwiftUI используется)
2925
- ключевые слова swift'а
3026

3127
(!) Если у объекта есть функция и переменная с одинаковым именованием, то Swift будет видеть только последнюю из объявленных.
3228

33-
## Полезные вопросы на подумать из kotlinlang.slack
29+
> SKIE частично решает эти проблемы, генерируя Swift-обёртки с корректными именами.
3430
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 из коробки
4032

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

Comments
 (0)