ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

UIKit vs SwiftUI どの状況に適しているのか?

UIKit vs SwiftUI どの状況に適しているのか?
こんにちは。iOSエンジニアのキムです。 iOSアプリを開発する際、UIKitとSwiftUIのどちらを選択すべきか悩むことがあります。これらのフレームワークは、それぞれ異なる特性と強みを持ち、状況に応じて適した選択が異なります。本記事では、それぞれの特徴とメリット・デメリットを比較し、実際の使用ケースを基に、どのような場面でどちらが適しているのかを解説します。

2つのフレームワークの長所と短所、実際の使用事例を比較

UIKit:伝統的な強者

  1. 特徴
    UIKitはiOS 2.0から提供されている、伝統的なUIフレームワークです。Interface BuilderやStoryboardを使ってUIを視覚的に構築でき、コードによる詳細な制御も可能です。

  2. メリット
    安定性:長年にわたり実績があり、多くの機能と豊富なドキュメントが存在します。
    柔軟性:複雑なUIやカスタムコンポーネントの作成に適しています。
    互換性:多くのiOSバージョンと互換性があり、既存のコードとの統合が容易です。

  3. デメリット
    複雑さ:コードが冗長になりがちで、宣言型プログラミングに比べて直感的ではありません。
    学習コスト:Auto LayoutやDelegateパターンは初心者にとって難しい場合があります。

使用ケース
  • 既存プロジェクトの保守:UIKitで作成されたプロジェクトの更新や機能追加。
  • 複雑なカスタムUI:詳細なレイアウト制御や複雑なビュー構造が必要な場合。
  • 古いiOSバージョンのサポート:iOS 13以前のバージョンをサポートする必要がある場合。

SwiftUI: 未来への一歩

  1. 特徴
    SwiftUIは2019年にAppleが導入した最新のUIフレームワークで、宣言型の構文を使用してUIを構築します。iOS、macOS、watchOS、tvOSなど、すべてのAppleプラットフォームで使用できます。

  2. メリット
    簡潔なコード:宣言型の文法により、コードが短く、理解しやすいです。
    プレビュー機能:XcodeのCanvasを使ったリアルタイムプレビューで、開発速度が向上します。
    クロスプラットフォーム:一度コードを書けば、他のAppleプラットフォームでも再利用可能です。

  3. デメリット
    機能の制限:UIKitに比べて高度なカスタム制御が難しい場合があります。
    バージョン互換性:SwiftUIはiOS 13以降でしかサポートされないため、古いバージョンでは使用できません。
    新しい学習が必要:UIKitに慣れている開発者には、新しい概念への適応が必要です。

使用ケース
  • 新規プロジェクト:iOS 14以降をターゲットにする場合。
  • 迅速なプロトタイピング:シンプルなUIを素早く構築する場合。
  • シンプルなUI:データバインディングが多いアプリや、複雑でないUI構成に最適です。

UIKit vs SwiftUI: ソースコードを使った比較

それぞれのフレームワークの違いを理解しやすくするために、シンプルな「To-Doリスト」の例を使って、UIKitとSwiftUIの実装を比較します。

UIKitでの実装例
import UIKit

class ToDoViewController: UIViewController {
    
    let tableView = UITableView()
    var tasks = ["タスク 1", "タスク 2", "タスク 3"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "To-Doリスト"
        view.backgroundColor = .white
        setupTableView()
    }
    
    func setupTableView() {
        tableView.frame = view.bounds
        tableView.dataSource = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        view.addSubview(tableView)
    }
}

extension ToDoViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = tasks[indexPath.row]
        return cell
    }
}

ポイント
デリゲートパターンを使用して、UITableViewのデータソースを設定します。 UIをコードで組み立てるため、レイアウトの定義がやや冗長になります。 柔軟なカスタマイズが可能ですが、その分コードの記述量が多くなります。

SwiftUIでの実装例
import SwiftUI

struct ToDoView: View {
    let tasks = ["タスク 1", "タスク 2", "タスク 3"]
    
    var body: some View {
        NavigationView {
            List(tasks, id: \.self) { task in
                Text(task)
            }
            .navigationTitle("To-Doリスト")
        }
    }
}

struct ToDoView_Previews: PreviewProvider {
    static var previews: some View {
        ToDoView()
    }
}

ポイント
宣言型構文を使い、UIを直感的に構築できます。 Listを使用することで、テーブルビューを簡潔に実装できます。 プレビュー機能を使えば、Xcode内でリアルタイムに画面を確認可能です。

結論: どちらが適しているのか?

UIKitを選ぶべきケース

複雑なカスタムUIが必要、または既存のUIKitベースのプロジェクトを保守する場合。 iOS 13以前のバージョンをサポートする必要がある場合。

SwiftUIを選ぶべきケース

新しいプロジェクトで、最新のiOSバージョンをターゲットにする場合。 シンプルなUIやプロトタイピングを迅速に行いたい場合。 Appleの他のプラットフォーム(macOSやwatchOS)でも同じコードを使用したい場合。

まとめ

UIKitとSwiftUIはそれぞれ異なる強みを持っています。プロジェクトの要件やチームの経験に応じて適切なフレームワークを選択することが重要です。SwiftUIの進化は目覚ましいものがありますが、現時点では2つを組み合わせて使用するのが最も実用的なアプローチと言えるでしょう。 皆さんはどのフレームワークをどのような場面で使っていますか? コメントでぜひ共有してください!

--

ユニファでは新たな仲間を積極採用中です。

詳細についてはこちらからご確認ください。

unifa-e.com