KMP Урок 6: Что в Kotlin не как в Swift
Первые пять уроков мы шли по материалам, которые ты и так знал: синтаксис, null safety, функции, лямбды, классы, коллекции. Kotlin звал уже знакомые вещи другими словами, и этого уже хватало для разработки, но...
Шестой урок устроен иначе. Уже изведанные знания пропускаем:
• Что такое дженерик
• Как объявить класс
• Что такое исключение
Это всё для нас известно.
Мы же возьмём только те знания, которые для Kotlin имеет расхожодение, то куда тянется рука после Swift. И где этот поворот аукнется на границе работы с иос.
• Дженерики. Почему is List не компилируется, и проверка на список со звездой проходит.
Как inline и reified возвращают тип в рантайм, и почему такую функцию нельзя звать из Swift?.
Вариантность out / in прямо на объявлении, отсюда и List из пятого урока. Звёздочка в дженерике: читать можно, класть нельзя, не перепутать! И как запретить null в аргументе типа через T : Any, чего в Swift не выразить вовсе.
• Дженерики на границе с иос. Отдельная подтема, ради которой всё и затевалось. Через бридж дженериком доезжает только класс.
Функция и интерфейс приедут, но параметр типа потеряется: non null становится optional, вариантность Swift игнорирует, остаётся приведение силой.
• Делегирование by. Приём, которого в Swift как языковой конструкции нет: class X : Foo by bar пробрасывает весь интерфейс одной строкой, переопределяешь только нужное.
Плюс делегаты свойств: by lazy, observable и vetoable, by map. И свой делегат через getValue / setValue, прямой двойник из нашего property wrapper.
• Исключения. Компилятор не подстрахует: ни throws в сигнатуре, ни try на вызове, бросить исключение может любая функция. При этом сам try - это выражение, как if и when.
Дальше Result и runCatching, и главная ловушка темы: runCatching глотает отмену корутины. Экран, с которого пользователь уже ушёл, доигрывает код и получает ошибку сети.
В конце, как обычно, домашка по нарастающей:
1. easy
2. easy+
3. medium
По времени выходит на 2,5-3 часа. Ну и само собой: вопросы, предложения, замечания - в лс или комменты всегда жду!