처음 KMP 프로젝트를 만들면 shared 모듈에서 다음과 같은 코드를 볼 수 있다.
//iosMain
class IOSPlatform: Platform {
override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}
actual fun getPlatform(): Platform = IOSPlatform()
//androidMain
class AndroidPlatform : Platform {
override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}
actual fun getPlatform(): Platform = AndroidPlatform()
//commonMain
interface Platform {
val name: String
}
expect fun getPlatform(): Platform
expect / actual은 KMP에서 제공되는 키워드 이다.
위 코드를 보면 유추 할 수 있듯이 플랫폼에 종속적인 부분을 구현해야할때 사용한다.
위 코드에서는 ios는 UIDevice android는 android.os.Build를 이용한다.
//commonMain
class Greeting {
private val platform: Platform = getPlatform()
fun greet(): String {
return "Hello, ${platform.name}!"
}
}
그래서 구현된 Greeting에서 getPlatform()을 통해 공유된 로직을 쓸 수 있다.
Kotlin/Native에는 이미 ios에서 사용하는 UIKIt,Foundation등이 사용 할 수있게 되어있으니 구현은 하기 나름이다.