前書き
私は普段Androidアプリエンジニアとして働いています。これまでiOSエンジニアが不足している状況で一時的に画面の実装や改修を手伝った経験はありました。しかしアーキテクチャやライブラリの選定といった部分に関わる機会はここ数年あまりありませんでした。
Androidアプリ開発がJetpack ComposeやKotlin Coroutinesの登場で大きく変化したように、iOSアプリ開発の世界でもSwiftUIやCombine、Swift Concurrencyなどが広く使われ始めています。
そこで最近、個人的な興味としてiOSアプリ開発を改めてキャッチアップしています。今回はその学習内容をアドベントカレンダーの記事としてまとめました。
Androidエンジニア視点での比較も交えながら記載するので、同じようにiOSアプリ開発をキャッチアップする方の参考になれば幸いです。
1. UI (SwiftUI)
1-1. SwiftUI とは
- iOS13 から登場した 宣言的UIフレームワーク
- Androidで言う Jetpack Compose と似た思想で、Viewをコードベースで宣言し、データや状態が変化すると画面が自動的に再構築される
1-2. UIKit(従来のUI実装)との違い
-
UIKit:
UIViewController
やUIView
を継承し、Auto Layout・Storyboardなどで Imperative(命令的)にUIを記述していた。 - 学習コスト: UIKitに慣れたエンジニアには新しい概念だが、Android の Jetpack Compose に触れたことがあれば比較的スムーズに理解できる。
- 互換性: 既存プロジェクトに SwiftUI を少しずつ導入するハイブリッド構成も可能(UIKit 上に SwiftUI を埋め込む、またはその逆)
1-3. Androidエンジニア目線でのポイント
- Jetpack Composeで宣言的UIのパラダイムに慣れていれば大まかなイメージは同じ
- Preview 機能などもComposeと同様に用意されており、画面の即時フィードバックが得られる
- Storyboardを使って実装していた頃よりかなり取っ付きやすくなった
2. 非同期処理(Combine/Swift Concurrency)
2-1. Combine
- Apple製の リアクティブプログラミング用フレームワーク
-
Publisher
とSubscriber
という概念でイベントストリームを扱う - Androidの Kotlin Coroutines Flow や RxJava/RxKotlin に近い動作概念
2-2. RxSwift との比較
- Combine は Apple 公式フレームワークとして OS の各機能と親和性が高い
-
RxSwift はサードパーティとして豊富なオペレータや実績があるが、Combine の登場以降、公式を優先する風潮が強まりつつある
Androidアプリ開発におけるRxからKotlin Coroutinesに移行する流れと近い。
2-3. Swift Concurrency
- iOS15 以降は Swift Concurrency も導入され、Combine と組み合わせるケースが増えている。
- 特に
async/await
は Coroutines と似た感覚で直感的に書きやすい。 - Combine と Swift Concurrency は共存可能だが、場面に応じて使い分けるプロジェクトが多い
3. パッケージ管理
3-1. Carthage / CocoaPods から Swift Package Manager (SPM) へ
-
CocoaPods: 一時期は iOS開発のデファクトスタンダードだったが、
Podfile
やPod install
等の煩雑な管理が必要 - Carthage: 観測範囲だとここ最近は使われなくなりつつある(?)
- Swift Package Manager (SPM): Apple公式のパッケージ管理。Xcode上で直接ライブラリを追加・管理可能。設定が簡潔で、CocoaPodsよりも標準的に使われつつある
3-2. SPM のメリット
- 公式ツール なので Xcode との統合がスムーズ。
-
Package.swift
というSwiftベースのファイルで依存を記述。 - Gitリポジトリさえあれば独自ライブラリとして管理もしやすい
4. DI
DIのAndroidとiOSの違い
-
Android
- Google 製の Dagger / Hilt がデファクトスタンダード
- Kotlin では Koin など軽量なDIフレームワークも人気
-
iOS
- 公式の DI フレームワークは存在しない
- サードパーティで Swinject, Needle, Resolver などが有名(?)
- Androidよりも 自前DI(コンストラクタ注入) で完結する場面が多い
その他トピック
以降はまだ学習中のトピック
Swift
Swift5.9で所有権など多くの機能が追加された
アーキテクチャ
TCA (The Composable Architecture) をよく見聞きする機会が増えたが、まだ学習しきれていない。AndroidでいうとCompose + MVI が近い?
データ永続化についてのトレンド
- Realm: iOS/Android 双方で使われるDBライブラリだったが、AndroidではRoomが定番化。iOSだと Realm を今でも使っているプロジェクトが多い印象
まとめ
SwiftUI、Combine、Swift Concurrency、Swift Package Manager、TCA などが、ここ数年でモダンiOS開発の中心的存在になっている。
Androidエンジニアから見ると、Jetpack Compose・Kotlin Coroutines・MVI と類似した関係にあるため、全体像をつかむハードルはそこまで高くなさそう
ただし、DI周りやデータ永続化(Core Data)などは iOS特有の文化が残っているため、Androidエンジニアの感覚でそのまま移行すると違和感を覚えることもある