expect/actual
expect/actual - это механизм, позволяющий использовать в общем коде платформенную реализацию класса, функции или переменной. Изучите раздел на официальном сайте.
В качестве практического задания, предлагаем вам:
- Создать новый KMM проект по инструкции
- используйте
CocoaPods dependency manager
в качестве iOS Framework distribution - прочитайте о CocoaPods dependency manager и Regular framework
- используйте
- Добавить в общий код
expect
функциюlog()
- Добавить
actual
реализацию функцииlog
для Android, используя функциюLog.d(String tag, String msg)
из пакетаandroid.util
- Добавить
actual
реализацию функцииlog
для iOS, используяNSLog()
- Протестировать на обеих платформах
Добавление зависимостей
Как вы уже знаете из раздела Основы Kotlin Multiplatform Mobile, подключить библиотеку можно напрямую к таргету, а с помощью expect
и actual
использовать ее в общем коде.
Для практики, выполните следующее задание. Используйте проект, который вы изменяли ранее:
- Подключите moshi к Android таргету
- Подключите pod NSTEasyJSON к shared блоку
- Добавьте в Podfile строку
pod 'NSTEasyJSON'
- В gradle этого блока в разделе
cocoapods
добавить эту библиотеку: pod("NSTEasyJSON"). Инструкция.cocoapods {
summary = "Some description for the Shared Module"
homepage = "Link to the Shared Module homepage"
ios.deploymentTarget = "14.1"
podfile = project.file("../iosApp/Podfile")
framework {
baseName = "shared"
}
pod("NSTEasyJSON")
}
- Добавьте в Podfile строку
- Добавьте expect функцию
getValueByKeyFromJsonString(jsonString: String, key: String): String
в блокshared/src/commonMain/kotlin
- Добавьте в блок
shared/src/commonMain/kotlin
константуjsonStringConst
, проинициализируйте ее любым Json-ом, сервис для генерации - Для каждой платформы выведите на экран значение какого-нибудь поля
- Добавьте
actual
реализацию функцииgetValueByKeyFromJsonString
в блокshared/src/androidMain/kotlin
используя библиотеку moshi - Добавьте
actual
реализацию функцииgetValueByKeyFromJsonString
в блокshared/src/iosMain/kotlin
используя библиотеку NSTEasyJSON- Для получения доступа к библиотеке NSTEasyJSON, добавьте
import cocoapods.NSTEasyJSON.NSTEasyJSON
- Как использовать функцию из файла в iOS проекте: во время компиляции компилятор складывает все top level декларации (функции и свойства вне класса) в синтетический класс Kt, поэтому функция, находящаяся в файле
shared/src/iosMain/kotlin/getValueByKeyFromJsonString.kt
будет доступна на iOS вот так:GetValueByKeyFromJsonStringKt.getValueByKeyFromJsonString(jsonString:, key:)
- Для получения доступа к библиотеке NSTEasyJSON, добавьте
- Добавьте
typealias
Чтобы узнать, как можно упросить использование механизма expect/actual, прочитайте о возможностях typealias
и выполните следующие действия, используя проект, который вы изменяли ранее:
- Создайте
expect class AtomicRef
- Добавьте
actual
реализацию используяtypealias
и классjava.util.concurrent.atomic.AtomicReference
- Добавьте
actual
реализацию для iOS - Убедитесь в успешной компиляции приложения