Skip to main content

Kotlin/Swift interop

Top-level функции в Kotlin Multiplatform и их вызов из Swift

В Kotlin мы можем объявлять глобальные функции (top-level functions), то есть функции вне классов и объектов:

fun log(message: String) {
println(message)
}

На Android такие функции вызываются напрямую. Но при интеграции с iOS возникает ощущение, что это функция не видна в Swift коде. Дело в том, что Swift получает доступ к Kotlin-функциям через Objective-C. В Objective-C глобальных функций нет, поэтому компилятор Kotlin при экспорте в iOS “упаковывает” top-level функции в специальные классы. Имя этого класса формируется из названия файла, где функция была определена. Если, например, функция log находится в Logger.kt, то в Swift её нужно вызвать так:

LoggerKt.log("Hello from iOS")

То есть доступ к функции осуществляется не напрямую, а через сгенерированный класс LoggerKt.

Однако при использовании SKIE всё работает так, как ожидается - глобальные функции становятся настоящими глобальными функциями в Swift.

И тогда на swift мы сможем писать так:

log("Hello from iOS")

Подробнее: https://skie.touchlab.co/features/global-functions

Полезные ссылки: