我想具体了解各个客户端模块如何使用公共模块。哪些是所有客户端和服务器共享的真正通用部分。
谢谢你。
这很简单。我怀疑你在谈论 Kotlin 多平台模块。
考虑print
和println
。
在 common 模块中我们可以expect
打印一个函数:
expect fun print(a: String)
但我们不知道它是如何实现的,因为通用模块对 JavaSystem.out
以及 JavaScript 的console
.
但是通用模块可以在屏幕上expect
打印这样的功能String
,而不提供实现。
既然我们有print
,我们可以实现println
:
fun println(a: String) = print("$a\n")
上面的所有代码都在 common 模块内。
而你所要做的就是print
为 JVM/JS 单独实现。
对于 JVM:
actual fun print(a: String) = System.out.println(a)
对于 JS:
actual fun print(a: String) = console.log(a)
(也许)对于本地人:
actual fun print(a: String) = printf(a)
上面的三个代码块位于客户端模块内。
考虑你设计了一种数据格式,你有编码和解码代码。这些代码用于您的 Android 设备 (JVM)、后端服务器 (JVM)、前端网页 (JS)、本机应用程序 (Native)。
您在所有这些子项目中都使用 Kotlin,但您只想编写一次编码器/解码器。Kotlin 多平台模块解决了这个问题。
它没有使用标准的 kotlin 方法来创建多平台项目。这是gradle的一个技巧。
有一个readResources
(randomInit
对于 osx/linux 也是如此)函数在平台上实现不同但具有相同的签名,并且 gradle 将决定哪些Kommon.kt
应该与客户端项目一起编译。
readResources
并且randomInit
应该被标记为actual
,并且应该有一个“公共模块”已经“预期”了这两个功能。
他们没有这样做可能是因为 KotlinConf 举行时 Kotlin 1.2(带来稳定的多平台支持)还没有推出。