Swift for Android vs Kotlin Multiplatform — マルチプラットフォーム時代の「Xbox vs PlayStation」
Level Up Coding の記事(Jacob Bartlett 氏)が注目を集めています。同じローラーコースターアプリを Swift for Android と Kotlin Multiplatform(KMP)の両方で構築し、開発体験を徹底比較した実践レポートです。
著者はこの 2 つの技術を「Xbox vs PlayStation」に例えています。どちらも「ビジネスロジックを共有し、UI はネイティブで書く」という同じアーキテクチャ思想を持ちながら、アプローチが正反対です。iOS 開発者が Android に進出するか、Android 開発者が iOS に進出するか — その出発点の違いが設計全体に反映されています。
2 つのアプローチ — 同じ目的、逆の方向
両技術の根本的な違いは「どちらのプラットフォームを起点にするか」です。
Swift for Android:
iOS (SwiftUI) ← Swift コア → Android (Jetpack Compose)
"iOS ファーストの開発者が Android に展開"
Kotlin Multiplatform:
Android (Jetpack Compose) ← Kotlin コア → iOS (SwiftUI)
"Android ファーストの開発者が iOS に展開"
| 項目 | Swift for Android | Kotlin Multiplatform |
|---|---|---|
| 共有言語 | Swift | Kotlin |
| コンパイル方式 | Swift → ネイティブ .so(JNI 経由) | Kotlin → ネイティブバイナリ(Obj-C ヘッダ生成) |
| Android 側 UI | Jetpack Compose | Jetpack Compose |
| iOS 側 UI | SwiftUI | SwiftUI |
| 境界技術 | JNI + swift-java 自動バインディング | Kotlin/Native + Obj-C 互換 |
| 開発開始年 | 2025 年(プレビュー) | 2017 年 |
Swift for Android の仕組み — swift-java と JNI
Swift for Android は 2025 年 10 月に公式プレビューとしてリリースされました。Swift Android Workgroup が Swift.org の公式ワークグループとして設立され、Android を Swift の正式サポートプラットフォームにする取り組みが進行中です。
アーキテクチャ
Swift コードは Android 上でネイティブマシンコードに直接コンパイルされます。C/C++ の NDK と同等のパフォーマンスです。
Swift ソースコード
↓ コンパイル
ネイティブ .so ライブラリ
↓ JNI (Java Native Interface)
Android Runtime (ART)
↓ swift-java 自動バインディング
Kotlin/Java コード → Jetpack Compose UI
swift-java プロジェクトの jextract と wrap-java ツールが、Swift と Java 間のバインディングを自動生成します。開発者は JNI のボイラープレートを手書きする必要がありません。
現在の制約
- ナイトリービルドのみ: Swift 6.3 SDK の nightly preview としてのみ提供
- 型変換の摩擦: Foundation 型が JNI 境界をクリーンに通過しない場面がある
- デバッグの非対称性: Swift コードのステップ実行は iOS 側でのみ可能
- 3 つのツールチェーン: Swift 6.3-dev を含む複数のツールチェーンのインストールが必要
本番実績
プレビュー段階ながら、すでに本番環境で動作しているアプリがあります。
- Spark: メールクライアント
- flowkey: ピアノ学習アプリ
これらは合計で数百万ダウンロードを記録しています。
Kotlin Multiplatform の成熟度 — 8 年の蓄積
KMP は 2017 年から開発されており、8 年間の成熟期間を経ています。2025 年 5 月に Compose Multiplatform for iOS が安定版に到達し、エンタープライズ採用が加速しています。
2026 年の現在地
| 指標 | 数値 |
|---|---|
| 採用率の変化 | 7% → 23%(18 ヶ月で 3 倍) |
| Compose Multiplatform for iOS | 安定版(2025 年 5 月〜) |
| iOS での ProMotion | 120Hz 対応(Metal ハードウェアアクセラレーション) |
| 典型的なコード共有率 | 80-90%(ビジネスロジック + UI 共有時) |
エンタープライズ採用事例
| 企業 | 用途 | 成果 |
|---|---|---|
| Google Workspace | Google Docs iOS アプリ | KMP を本番運用 |
| Duolingo | モバイルアプリ全体 | 週次リリース・4,000 万以上のユーザー |
| AWS | SDK | 300 以上のサービスに対応 |
| Airbnb | 予約ロジック | 6 ヶ月で 95% コード共有・月次→週次リリース |
| Netflix | モバイルアプリ | 数百万 DAU に KMP で提供 |
expect/actual パターン
KMP のプラットフォーム固有実装は expect/actual パターンで記述します。
| |
実装比較 — 同じアプリを両方で構築
Jacob Bartlett 氏は同じローラーコースターアプリを両技術で構築し、GitHub で公開しています。
データモデル
| |
| |
ネットワーキング
Swift のクロスプラットフォーム実装では、非 Darwin 環境向けに FoundationNetworking の条件付きインポートが必要です。KMP は Ktor HttpClient と suspend 関数で、プラットフォームを意識せずに記述できます。
セットアップの複雑さ
| 項目 | Swift for Android | KMP |
|---|---|---|
| 必要なツールチェーン | 3 つ(Swift 6.3-dev 含む) | Java 21 + Gradle |
| Gradle 設定 | 複雑(手動 .so 管理) | 比較的シンプル |
| Xcode 統合 | ネイティブ | ビルドスクリプト設定 |
| IDE 間の移動 | 必要 | 必要 |
モジュール境界の摩擦 — 両者共通の課題
どちらのアプローチも「シャープなモジュール境界」を生み出します。
共有コア ←── モジュール境界 ──→ プラットフォーム固有コード
↑
ここで摩擦が発生
以下のシステムフレームワーク統合は、両方とも手動でプラットフォーム固有のグルーコードが必要です。
- 位置情報サービス
- プッシュ通知
- カメラアクセス
- 暗号化 API
Flutter や React Native はこれらの統合に統一的なブリッジを提供しますが、Swift for Android と KMP は「ビジネスロジック共有・UI ネイティブ」の思想を優先しているため、この摩擦を受け入れる設計になっています。
ViewModel の配置 — 50% vs 80% の選択
ViewModel を共有コードに含めると、コード共有率は約 50% から約 80% に跳ね上がります。しかし SwiftUI は @Observable パターンを、Jetpack Compose は StateFlow を好むため、境界に変換レイヤーが必要になります。
Bartlett 氏はこの複雑さを避けるため、ViewModel をネイティブ側に配置する選択をしました。「正しいものを共有する」という KMP コミュニティの教訓 — ビジネスロジックであって、UI ではない — がここでも効いています。
クロスプラットフォーム技術全体の位置づけ — 2026 年
| フレームワーク | コード共有率 | UI アプローチ | パフォーマンス | 採用傾向 |
|---|---|---|---|---|
| Swift for Android | 40-80% | ネイティブ(SwiftUI + Compose) | ネイティブ同等 | 新規・成長中 |
| KMP | 40-90% | ネイティブ or Compose MP | ネイティブ同等 | 急成長(23%) |
| Flutter | ~100% | Skia/Impeller レンダリング | 高速(60fps 安定) | 成熟・広く普及 |
| React Native | 80-90% | ネイティブ UI ブリッジ | 改善中(New Architecture) | 最大エコシステム |
「ビジネスロジック共有 + ネイティブ UI」派(Swift for Android, KMP)と「UI も含めて全共有」派(Flutter, React Native)の 2 つの哲学が併存しています。
現時点の結論 — 「今日なら KMP、明日は分からない」
Bartlett 氏の結論は明快です。
If you have to go multiplatform today, stick to KMP.
Swift for Android は SDK の安定化にもう数ヶ月必要です。ただし、開発チームの反復速度は速く、記事執筆中に async/await サポートが追加されるほどでした。
選択ガイド
| 状況 | 推奨 |
|---|---|
| 今すぐ本番投入が必要 | KMP |
| iOS ネイティブチームが Android に展開したい | Swift for Android(数ヶ月後に再評価) |
| UI も含めて最大限共有したい | Flutter |
| JavaScript エコシステムを活用したい | React Native |
| 実験プロジェクトで最先端を試したい | Swift for Android |
Swift for Android のロードマップ
| 項目 | 状況 |
|---|---|
| Swift 6.3 SDK ナイトリービルド | 提供中 |
| swift-java JNI バインディング | 動作中 |
@available によるAPI レベル分岐 | 最新プレビューで対応 |
| IDE デバッグ統合(VS Code, Android Studio) | 開発中 |
| Android エミュレータでのテスト実行 | 開発中 |
| Skip Tools 連携 | ワークグループメンバーに Skip 創設者 |
まとめ
- 同じ思想、逆の方向: Swift for Android は iOS→Android、KMP は Android→iOS の進出を可能にする。どちらも「ビジネスロジック共有・UI ネイティブ」の設計思想を共有
- 成熟度の差は歴然: KMP は 8 年の蓄積で安定版到達、Swift for Android は 2025 年プレビュー開始で急速に進化中。本番投入は KMP が現実的
- Compose Multiplatform 安定版: iOS で 120Hz ProMotion 対応まで達し、Google Docs・Duolingo・Netflix が本番運用。採用率は 18 ヶ月で 7%→23%
- モジュール境界の摩擦は共通課題: 位置情報・通知・カメラ等のシステム統合は両方とも手動対応が必要。Flutter/React Native との差別化ポイントでもあり弱点でもある
- ViewModel 配置の判断: 共有コードに含めると共有率が 50%→80% に上がるが、SwiftUI と Compose の状態管理差異で摩擦が増す。「正しいものを共有する」原則が重要
- Swift for Android の急速な進化: 記事執筆中に async/await サポートが追加されるスピード。Skip Tools 創設者がワークグループに参加しており、エコシステム拡大に期待
- 「Xbox vs PlayStation」の本質: どちらが勝つかではなく、両方が存在することでモバイル開発のマルチプラットフォーム化が不可逆的に進む
参考
- Swift for Android vs. Kotlin Multiplatform — Jacob Bartlett
- Swift for Android vs. Kotlin Multiplatform — Level Up Coding
- Exploring the Swift SDK for Android — Swift.org
- Apple Previews SDK for Building Android Apps with Swift — InfoQ
- Compose Multiplatform 1.10.0 — JetBrains Blog
- Kotlin Multiplatform in 2026: Is Mobile Silos Era Over? — DataCouch
- SwiftAndroid-vs-KMP — GitHub リポジトリ(ソースコード)
- KMP vs Flutter vs React Native — Java Code Geeks
- An official Swift SDK for Android — Skip.tools