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
- Убедитесь в успешной компиляции приложения