0Pricing
Kotlin Academy · Урок

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(): String

actual на Android

Каждая платформа предоставляет реализацию actual, соответствующую сигнатуре.

// androidMain
actual fun platformName(): String = "Android " + android.os.Build.VERSION.SDK_INT

actual на 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 объявляет контракт в commonMain
  • actual реализует его для каждой платформы (или через 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 — локальная установка не требуется.

Все уроки этого курса

  1. Структура проекта KMM
  2. expect и actual
  3. Совместное использование бизнес-логики
  4. API платформ
← Назад к Kotlin Academy