expect 与 actual
平台专属实现
expect 与 actual 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
平台代码的必要性
有些功能没有通用实现,例如获取 OS 名称、UUID 或当前平台。KMM 通过 expect/actual 机制解决这个问题。
expect 声明
您可以在 commonMain 中声明一个 expect 函数或类,它是一份没有函数体的契约。公共代码可以调用它。
// commonMain
expect fun platformName(): StringAndroid 上的 actual
每个平台都会提供一个与签名匹配的 actual 实现。
// androidMain
actual fun platformName(): String = "Android " + android.os.Build.VERSION.SDK_INTiOS 上的 actual
iOS 源集会使用原生 API 提供自己的版本。
// iosMain
import platform.UIKit.UIDevice
actual fun platformName(): String =
UIDevice.currentDevice.systemName + " " + UIDevice.currentDevice.systemVersion在公共代码中使用
公共代码可以像调用真实存在的函数一样调用 expect 函数;编译器会为每个目标平台链接正确的 actual 实现。
// commonMain
class Platform {
val name: String get() = platformName()
}expect 类
您可以声明一个完整的类作为 expect。每个平台都会提供一个成员匹配的 actual 类。
// commonMain
expect class FileReader(path: String) {
fun read(): String
}actual 类实现
各个平台使用原生文件 API 实现 expect 类,例如 Android 上的 Java IO 和 iOS 上的 Foundation。
// androidMain
actual class FileReader actual constructor(private val path: String) {
actual fun read(): String = java.io.File(path).readText()
}使用 typealias 的 expect
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」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「expect 与 actual」这节课中我会学到什么?
平台专属实现 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「expect 与 actual」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。