Day 7:How do you turn this on? KMM是如何做到的?

Keyword: KMM shared module, Expect/Actual


今天我们来看看范例专案内容,先切换到Project显示,展示整个专案的内容.

KMM可以跨平台运行的魔法,就藏在shared的模组中.

https://github.com/officeyuli/itHome2021/raw/main/day7/project%20structure.jpg

shared正如其名,是负责共用的部分的区块,而其中的commonMain资料夹更是用来存放双平台均通用的部分,让我们点开commonMain的资料夹

https://github.com/officeyuli/itHome2021/raw/main/day7/commonMain.jpg

可以看到有两个物件,Greeting与Platform.先打开Greeting物件,可以看到下面的程序码.

class Greeting {
    fun greeting(): String {
        return "Hello, ${Platform().platform}!"
    }
}

内容很简单,就有一个方法,内容是呼叫Platform并且回传一串字串.我们再点开Platform看看其中的内容.

expect class Platform() {
    val platform: String
}

也是很简单的,但是有一个不大熟悉的关键字出现"expect",并且旁边还有一个特别的符号在.像是一个”A“

点了下去会有两个选项可以选择,还都叫Platform,只是其中一个看路径...好像在iosMain内?随便选一个会发生跳转,这次符号变成了一个"E"

Expect与Actual

眼尖的人刚刚应该已经注意到在class前面已经分别有Expect与Actual的关键字了.

原来,这个是KMM提供给各平台分别实做的关键字.

由Expect关键字定义这个物件提供怎样的属性与方法.

以这个范例来说就是提供一个字串

而两个以Actual标记的物件,则是各平台对於这个Expect的实作.

可以看到Android的是

actual class Platform actual constructor() {
    actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}

并且放在androidMain的package下

而iOS则是

actual class Platform actual constructor() {
    actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}

放在iosMain的package下

而最後上层的画面,能直接使用的,只有sharedMain的内容.

可以看看androidApp内的MainActivity,是负责显示的VIew层,在KMM的架构中,显示的View层是由各平台自行实作的.

Android当然是直接使用Kotlin撰写

...
import com.officeyuli.myapplicationkmm.Greeting
...
fun greet(): String {
    return Greeting().greeting()
}
...

而iOS的View层,则是由iOS的原生语言Swift撰写

...
import shared
...
struct ContentView: View {
	let greet = Greeting().greeting()

	var body: some View {
		Text(greet)
	}
}

了解了KMM如何共用後,明天我们开始修改这个专案,让内容更加丰富


<<:  K8s - Kubernetes Django 部署笔记

>>:  从 JavaScript 角度学 Python(11) - 串列 20 种操作的方法

DAY22 类神经网路之架设与训练

前面我们介绍了影像辨识的资料前处理方法,今天就要开始教大家架设一个神经网路,并将资料丢入来看看实际的...

【Day9】 Speaker Identification 介绍与 D_VECTOR 实做

旧时代的 Speaker Identification 同一人讲不同话,再转成 Mel 之後还是不同...

Day 23 K-平均演算法 K-Means

介绍: k-平均演算法(英文:k-means clustering,以下简称为 k-means )是...

要上传档案,你需要知道的事-MIME(1)

MIME 类别 (IANA 媒体类别) - HTTP | MDN 当我们要发 request 时候,...

TypeScript | interface 研究心得纪录 1

我习惯理解一个东西,可以套用日常的生活经验,找出类比、拟人化会帮助我更好理解,今天的议题是最近看到 ...