普段使っているクリーンアーキテクチャのUseCaseの作り方と使い方


Templateつくりました!
https://github.com/yosuke1985/Clean-MVVM-Generator/blob/main/Clean%20MVVM/UseCase.xctemplate/___FILEBASENAME___UseCase.swift

例えばuserに紐付いたTodoを取得するGetTodoListUseCaseがあるとして、

テスタブルな設計にするためにもInputとOutputをプロトコルで定義する。
Inputは userID:String
Outputは GetTodoListUseCaseResult で定義する。
Outputには、成功パターンと失敗パターンを明記する。

import UIKit
import RxCocoa
import RxSwift

enum GetTodoListUseCaseResult {
    case success(element: [Todo])
    case failure(errorType: ErrorType)

    enum ErrorType {
        case someError
    }
}

protocol GetTodoListUseCaseInjectable {
    var getTodoListUseCaseImpl: GetTodoListUseCase { get }
}

extension GetTodoListUseCaseInjectable {
    var getTodoListUseCaseImpl: GetTodoListUseCase {
        return GetTodoListUseCaseImpl()
    }
}

protocol GetTodoListUseCase {
    func getTodoList(userID: String) -> Single<GetTodoListUseCaseResult>
}

class GetTodoListUseCaseImpl: GetTodoListUseCase {
    let bag = DisposeBag()

    func getTodoList(userID: String) -> Single<GetTodoListUseCaseResult> {
         // ここでレポジトリ経由でタスクをゲットする
        return Single<GetTodoListUseCaseResult>.never()
    }
}

上記のUseCaseのoutputはGetTodoListUseCaseResultですので、

GetTodoListUseCaseResult.getTodoList(userID: "yosuke8080")
           .subscribe( onNext: { getTodoListUseCaseResult in

             switch GetTodoListUseCaseResult {
              case .success(let todoList):
                 // ここで取得したtodoListでゴニョゴニョする
              case .failure(let error):
                // 准正常系

              }
          }, onError: { error in
              // 異常系
              fatalError(error.localizedDescription)
         })
          .disposed(by: bag)

ここでは、異常系に入る場合はfatalError()でアプリ自体を落とす処理にしています。