プラットフォーム上でコードを共有する
Kotlin Multiplatform を使用すると、Kotlin が提供するメカニズムを使用してコードを共有できます。
- プロジェクトで使用されているすべてのプラットフォーム間でコードを共有する。すべてのプラットフォームに適用される共通のビジネスロジックを共有するために使用します。
- プロジェクトに含まれているが、すべてではない一部のプラットフォーム間でコードを共有する。階層構造を利用して、類似したプラットフォームでコードを再利用できます。
共有コードからプラットフォーム固有の API にアクセスする必要がある場合は、Kotlin の expected と actual の宣言のメカニズムを使用します。
すべてのプラットフォームでコードを共有する
すべてのプラットフォームに共通のビジネスロジックがある場合、プラットフォームごとに同じコードを作成する必要はありません。共通のソースセットで共有するだけです。
ソースセットの一部の依存関係はデフォルトで設定されています。dependsOn
関係を手動で指定する必要はありません。
jvmMain
、macosX64Main
など、共通のソースセットに依存するすべてのプラットフォーム固有のソースセットの場合。androidMain
やandroidUnitTest
など、特定のターゲットのmain
とtest
のソースセット間の場合。
共有コードからプラットフォーム固有の API にアクセスする必要がある場合は、Kotlin の expected と actual の宣言のメカニズムを使用します。
類似したプラットフォームでコードを共有する
多くの場合、共通のロジックとサードパーティ API を再利用できる可能性のある複数のネイティブターゲットを作成する必要があります。
たとえば、iOS をターゲットとする典型的なマルチプラットフォームプロジェクトでは、iOS 関連のターゲットが 2 つあります。1 つは iOS ARM64 デバイス用、もう 1 つは x64 シミュレーター用です。これらには個別のプラットフォーム固有のソースセットがありますが、実際にはデバイスとシミュレーターで異なるコードが必要になることはほとんどなく、依存関係もほとんど同じです。そのため、iOS 固有のコードはそれらの間で共有できます。
明らかに、このセットアップでは、2 つの iOS ターゲットに対して共有ソースセットを用意し、iOS デバイスとシミュレーターの両方に共通の API を直接呼び出すことができる Kotlin/Native コードを使用できることが望ましいでしょう。
この場合、階層構造を使用して、プロジェクト内のネイティブターゲット間でコードを共有できます。 次のいずれかの方法を使用します。
ライブラリでのコード共有とプラットフォーム固有のライブラリの接続について詳しく学んでください。
ライブラリでコードを共有する
階層的なプロジェクト構造のおかげで、ライブラリはターゲットのサブセットに対して共通の API を提供することもできます。ライブラリが公開されると、中間ソースセットの API は、プロジェクト構造に関する情報とともにライブラリのアーティファクトに埋め込まれます。このライブラリを使用すると、プロジェクトの中間ソースセットは、各ソースセットのターゲットで使用できるライブラリの API のみにアクセスします。
たとえば、kotlinx.coroutines
リポジトリの次のソースセット階層を確認してください。
concurrent
ソースセットは関数 runBlocking を宣言し、JVM およびネイティブターゲット用にコンパイルされます。階層的なプロジェクト構造で kotlinx.coroutines
ライブラリが更新および公開されると、それに依存し、JVM とネイティブターゲット間で共有されるソースセットから runBlocking
を呼び出すことができます。これは、ライブラリの concurrent
ソースセットの「ターゲットシグネチャ」と一致するためです。
プラットフォーム固有のライブラリを接続する
プラットフォーム固有の依存関係によって制限されることなく、より多くのネイティブコードを共有するには、プラットフォームライブラリ(Foundation、UIKit、POSIX など)を使用します。これらのライブラリは Kotlin/Native と 함께 제공되며、デフォルトで共有ソースセットで使用できます。
また、プロジェクトで Kotlin CocoaPods Gradle プラグインを使用している場合は、cinterop
メカニズム で使用されるサードパーティのネイティブライブラリを使用できます。