返回 Skill 列表
extension
分类: 开发与工程无需 API Key

ios-clean-architecture

定义iOS应用的SPM包结构、层依赖关系和设计原则。在实现iOS功能和代码审查时参考。包括no problem制作的SPM包使用指南。

person作者: jakexiaohubgithub

iOS Clean Architecture

iOSアプリのクリーンアーキテクチャに基づくパッケージ構成と設計原則。

パッケージ依存図

                    ┌─────────────────┐
                    │  Presentation   │  SwiftUI Views, Components
                    └────────┬────────┘
                             │
    ┌───────────┬────────────┼────────────┬───────────┐
    ▼           ▼            ▼            ▼           ▼
┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐
│ State  │ │UseCases│ │Repository│ │ Services │ │  External    │
│        │ │        │ │          │ │          │ │  SPM (4)     │
└────┬───┘ └────┬───┘ └────┬─────┘ └────┬─────┘ └──────────────┘
     │          │    ↘     │      ↙     │
     │          └─────┬────┴──────┬─────┘
     │                ▼           │
     │       ┌──────────────┐     │
     └──────►│    Domain    │◄────┘
             └──────────────┘

: UseCasesはRepository・Servicesの両方に依存可能。ServicesはDomainのみに依存。

ローカルパッケージ(6つ)

| パッケージ | 責務 | 依存先 | |-----------|-----|--------| | Domain | ドメインモデル・値オブジェクト・列挙型 | なし | | Services | 再利用可能なアプリケーションサービス(外部SDK連携等) | Domain のみ | | Repository | API通信・データ永続化 | Domain, APIClient | | State | @Observable状態管理 | Domain, Authentication | | UseCases | ビジネスロジック(Protocol定義) | Domain, Repository, Services | | Presentation | SwiftUI View・コンポーネント | 全て |

Services層の原則

  • Domainのみに依存: Repositoryや他のパッケージへの依存は禁止
  • 再利用可能: 複数のUseCaseから利用される共通機能を提供
  • 外部SDK連携: HealthKit, CoreLocation, Analytics等のラッパー

no problem製外部SPM(4つ)

| パッケージ | モジュール名 | 用途 | 使用レイヤー | |-----------|------------|-----|------------| | swift-design-system | DesignSystem | テーマ・色・スペーシング・UIコンポーネント | Presentation | | swift-authentication | Authentication | Firebase Auth統合(Google/Apple Sign-In) | State, Presentation | | swift-ui-routing | UIRouting | 型安全ナビゲーション(Router, TabPresenter) | Presentation | | swift-api-client | APIClient | HTTP通信クライアント | Repository |

依存ルール(厳守)

許可される依存

// ✅ Presentation → 全て(最上層)
import Domain
import State
import UseCases
import Repository
import DesignSystem
import UIRouting
import Authentication

// ✅ UseCases → Domain + Repository + Services
import Domain
import Repository
import Services

// ✅ State → Domain + Authentication
import Domain
import Authentication

// ✅ Repository → Domain + APIClient
import Domain
import APIClient

// ✅ Services → Domain(外部サービス連携)
import Domain

// ✅ Domain → なし(最下層)
// 外部依存ゼロ(Foundationのみ許可)

禁止される依存

// ❌ Domain層での外部import
import Foundation  // ✅ OK(標準ライブラリ)
import UIKit       // ❌ 禁止
import SwiftUI     // ❌ 禁止
import DesignSystem // ❌ 禁止

// ❌ 下位レイヤーから上位への参照
import Presentation // ❌ 循環依存

// ❌ UseCases → State
import State // ❌ 状態管理は上位レイヤーの責務

// ❌ Services → Repository(Servicesは独立性を保つ)
import Repository // ❌ ServicesはDomainのみに依存

設計違反チェックリスト

実装前に確認:

  • [ ] Domain層にUI依存を追加していないか?
  • [ ] Repositoryから直接Viewを参照していないか?
  • [ ] UseCaseがStateを直接操作していないか?
  • [ ] ServicesがRepositoryに依存していないか?
  • [ ] 外部SPMを適切なレイヤーでのみ使用しているか?

詳細は REFERENCE.md を参照。