メインコンテンツまでスキップ

プラットフォーム上でコードを共有する

Kotlin Multiplatform を使用すると、Kotlin が提供するメカニズムを使用してコードを共有できます。

共有コードからプラットフォーム固有の API にアクセスする必要がある場合は、Kotlin の expected と actual の宣言のメカニズムを使用します。

すべてのプラットフォームでコードを共有する

すべてのプラットフォームに共通のビジネスロジックがある場合、プラットフォームごとに同じコードを作成する必要はありません。共通のソースセットで共有するだけです。

Code shared for all platforms

ソースセットの一部の依存関係はデフォルトで設定されています。dependsOn 関係を手動で指定する必要はありません。

  • jvmMainmacosX64Main など、共通のソースセットに依存するすべてのプラットフォーム固有のソースセットの場合。
  • androidMainandroidUnitTest など、特定のターゲットの maintest のソースセット間の場合。

共有コードからプラットフォーム固有の 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 リポジトリの次のソースセット階層を確認してください。

Library hierarchical structure

concurrent ソースセットは関数 runBlocking を宣言し、JVM およびネイティブターゲット用にコンパイルされます。階層的なプロジェクト構造で kotlinx.coroutines ライブラリが更新および公開されると、それに依存し、JVM とネイティブターゲット間で共有されるソースセットから runBlocking を呼び出すことができます。これは、ライブラリの concurrent ソースセットの「ターゲットシグネチャ」と一致するためです。

プラットフォーム固有のライブラリを接続する

プラットフォーム固有の依存関係によって制限されることなく、より多くのネイティブコードを共有するには、プラットフォームライブラリ(Foundation、UIKit、POSIX など)を使用します。これらのライブラリは Kotlin/Native と 함께 제공되며、デフォルトで共有ソースセットで使用できます。

また、プロジェクトで Kotlin CocoaPods Gradle プラグインを使用している場合は、cinterop メカニズム で使用されるサードパーティのネイティブライブラリを使用できます。

次は何ですか?