SwiftUI（iOS）におけるクリーンアーキテクチャ

## はじめに

こんにちは。この投稿では、Clean Architecture に基づいた Android アプリケーション開発のために構築したソースコードについて紹介します。
<TOCInline toc={props.toc} exclude="はじめに" />

このソースコードは私の個人 GitHub にアップロードしています。[GitHub](https://github.com/samyoney)。

これまで、MVVM、MVC、MVP、TCA などのモデルを使用してモバイルアプリを開発してきましたが、MVVM はテストが容易でメンテナンスも簡単であるため、最も実用性が高いと感じています。特に `use case` の概念は、`user story` から切り出して基本設計を行う際に非常に役立ちます。

## SwiftUI とは何か、そしてなぜ使用すべきか？

SwiftUI は、iOS、macOS、watchOS、tvOS のアプリケーションのユーザーインターフェース（UI）を構築するために Apple が開発したフレームワークです。2019年の WWDC で初めて紹介され、SwiftUI はモダンで宣言的なアプローチを提供し、開発者がより簡単かつ直感的に UI を作成できるようにします。

### SwiftUI を使用する利点

1. **読みやすい宣言的な構文（Declarative Syntax）**:
   - 望ましい状態を定義することで UI を作成し、コードが短く理解しやすくなります。

2. **迅速な開発とメンテナンス（Fast Development and Maintenance）**:
   - SwiftUI Preview を通じて UI の変更を即座に確認でき、開発とデバッグが迅速に行えます。

3. **再利用性と一貫性（Reusability and Consistency）**:
   - UI コンポーネントを簡単に作成および再利用でき、コードの重複を減らします。

4. **クロスプラットフォーム対応（Cross-Platform Support）**:
   - 同じコードを iOS、macOS、watchOS、tvOS で使用でき、時間と労力を節約します。

5. **Apple の他の技術との統合（Integration with Apple Technologies）**:
   - Combine や Core Data とうまく連携し、より強力なアプリケーションを構築できます。

---

## Clean Architecture を使用する理由

Clean Architecture は多くの利点を提供します。以下に簡単にまとめます。

1. **メンテナンス性の向上**: 簡単に保守および更新が可能。
2. **拡張性**: システムの他の部分に影響を与えることなく新機能を追加できます。
3. **テスト容易性の向上**: コンポーネントが分離され、テストが容易。
4. **依存性の削減**: 各クラスの依存関係が少なく、管理が容易。
5. **コアビジネスへの集中**: ビジネスロジックと UI コンポーネントの間の明確な分離。

## Clean Architecture の主な構成

1. **Entities**: ビジネスオブジェクトとアプリケーションのルールを定義。
2. **Use Cases**: ビジネスロジックを含み、データの処理と保存方法を決定。
3. **Interface Adapters**: ビジネス層とフレームワーク層の間でデータを変換。
4. **Frameworks**: UI、データベース、外部サービスなど、特定のフレームワークコンポーネントを含む。

Clean Architecture は、柔軟で保守しやすくテストしやすいアプリケーションを作成し、システムの現在の動作を中断せずに長期的な変更と開発をサポートします。

---

## ソースコードの概要

私は、最小限の機能を持つ MVP アプリケーションを作成しました。この最小限のアプローチは、アプリの基盤を貧弱にするのではなく、初心者にとってもアクセスしやすくします。今回のソースコードでは、[Swift-Data](https://developer.apple.com/xcode/swiftdata/)、[R.swift](https://github.com/mac-cain13/R.swift)、[Resolver](https://github.com/hmlongco/Resolver) などの最新技術を全て適用し、SwiftUI に適したクリーンコードの規則を使用しています。

## 画面フロー図

```md
+-----------+        +-----------+        +------------+
|           |        |           |        |            |
|  Splash   | ------>|   Login   | ------>|    Main    |
|  Screen   |        |   Flow    |        |    Flow    |
|           |        |           |        |            |
+-----------+        +-----------+        +------------+
```

## スクリーンショット

以下は、iOS アプリケーションの異なるモードのスクリーンショットです。
<table>
  <tr>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/splash-ios.png" alt="スプラッシュ画面" width="300"/>
      **スプラッシュ画面**
    </td>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/login-ios.png" alt="ログイン画面" width="300"/>
      **ログイン画面**
    </td>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/register-ios.png" alt="登録画面" width="300"/>
      **登録画面**
    </td>
  </tr>
  <tr>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/course-ios.png" alt="コース画面" width="300"/>
      **コース画面**
    </td>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/student-ios.png" alt="学生画面" width="300"/>
      **学生画面**
    </td>
  </tr>
</table>

*iOS*

## アプリケーションの構成

アプリケーションの構成は以下の5つの主要な部分で構成されています：

- **App**: ナビゲーション、アプリ、およびアプリの依存関係を管理します。
- **Core**: ユーザーデフォルトの処理、共通ビュー、キャッシュ保存、ネットワーク処理など、アプリの全般的な処理を含みます。
- **Presentation**: UI 画面を含みます。
- **Resource**: 文字列やアニメーションなど、アプリのリソースを含みます。
- **Data**: レポジトリ、API 管理、データベース、ユースケースなど、アプリ全体のデータを管理します。

---

## 結論

このソースコードがお気に召すことを願っています。ご意見やご提案がありましたら、GitHub で問題を報告するか、[LinkedIn](https://www.linkedin.com/in/sam-nguyen-204876192/) でご連絡ください。

## プロジェクト全体

プロジェクトのソースコードは以下のリンクからアクセスできます。[GitHub](https://github.com/samyoney/SwiftCleanBase)。

## 参考文献
- [SwiftUI 概要 - Apple Developer](https://developer.apple.com/xcode/swiftui/)
- [SwiftUI 基本 - Apple](https://developer.apple.com/tutorials/swiftui/creating-and-combining-views)
- [SwiftUI を使う理由 - Hacking with Swift](https://www.hackingwithswift.com/quick-start/swiftui/why-swiftui-is-the-future)

## ライセンス

[MIT](https://github.com/samyoney/compose_clean_base/blob/develop/LICENSE) © [Yoneyama SAM](https://samyoney.github.io/)