expect и actual
Реализации для конкретных платформ
«expect и actual» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Необходимость кода для платформы
Некоторая функциональность не имеет общей реализации: получение имени ОС, UUID или текущей платформы. KMM решает эту задачу с помощью механизма expect/actual.
Объявления expect
В commonMain вы объявляете функцию или класс expect — контракт без тела. Общий код может его вызывать.
// commonMain
expect fun platformName(): Stringactual на Android
Каждая платформа предоставляет реализацию actual, соответствующую сигнатуре.
// androidMain
actual fun platformName(): String = "Android " + android.os.Build.VERSION.SDK_INTactual на iOS
Набор исходного кода iOS предоставляет собственную версию, использующую нативные программные интерфейсы.
// iosMain
import platform.UIKit.UIDevice
actual fun platformName(): String =
UIDevice.currentDevice.systemName + " " + UIDevice.currentDevice.systemVersionИспользование в общем коде
Общий код вызывает ожидаемую функцию так, будто она уже существует; компилятор связывает с каждой целевой платформой подходящую реализацию actual.
// commonMain
class Platform {
val name: String get() = platformName()
}Классы expect
Можно объявить целый класс как expect. Каждая платформа предоставляет класс actual с соответствующими членами.
// commonMain
expect class FileReader(path: String) {
fun read(): String
}Реализации классов actual
Платформы реализуют ожидаемый класс с помощью нативных файловых программных интерфейсов (например, Java IO на Android и Foundation на iOS).
// androidMain
actual class FileReader actual constructor(private val path: String) {
actual fun read(): String = java.io.File(path).readText()
}expect с typealias
Реализацией actual может быть typealias для существующего типа платформы, что позволяет избежать оболочки.
// commonMain
expect class Uuid
// jvm/androidMain
actual typealias Uuid = java.util.UUIDПравила соответствия сигнатур
actual должен в точности соответствовать expect: иметь то же имя, параметры и возвращаемый тип. Несоответствие приводит к ошибке компиляции и гарантирует согласованность между платформами.
Когда не следует использовать expect/actual
Если абстракция должна быть более гибкой, отдавайте предпочтение простым интерфейсам с реализациями для платформы, внедряемым во время выполнения. Используйте expect/actual для небольших фиксированных примитивов платформы.
Пример общего кода
Вне KMM та же идея сводится к вызову абстракции. Здесь обычная функция заменяет вызов платформы.
fun platformName(): String = "Demo Platform"
fun main() {
println("Running on " + platformName())
}Быстрая проверка
Где записывается объявление expect и где находятся его реализации actual?
Итоги
expect/actual устраняет различия между платформами:
expectобъявляет контракт вcommonMainactualреализует его для каждой платформы (или черезtypealias)- Сигнатуры должны в точности совпадать
- Для гибких абстракций предпочтительнее интерфейсы
Далее: совместное использование бизнес-логики.
Часто задаваемые вопросы
Урок «expect и actual» бесплатный?
Да — полный текст урока «expect и actual» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «expect и actual»?
Реализации для конкретных платформ Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «expect и actual»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.