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()でアプリ自体を落とす処理にしています。