๊ธฐ์กด feature์ ์ ํ๋ฉด์ ์ถ๊ฐํ๋ ๋จ๊ณ๋ณ ๊ฐ์ด๋.
Presentation/{Feature}/ViewModels/XxxReactor.swift:
import Foundation
import ReactorKit
final class XxxReactor: Reactor {
enum Action {
case fetch
}
enum Mutation {
case setData(_ data: [SomeType])
case setLoading(_ isLoading: Bool)
}
struct State {
var data: [SomeType] = []
var isLoading: Bool = true
}
let initialState: State
var coordinator: FeatureCoordinator? // ๋๋ weak var delegate: XxxReactorDelegate?
init(coordinator: FeatureCoordinator, state: State = State()) {
self.coordinator = coordinator
self.initialState = state
}
func mutate(action: Action) -> Observable<Mutation> {
switch action {
case .fetch:
let data = Items.shared.someStream.map { Mutation.setData($0) }
let loading = Items.shared.isLoading.map { Mutation.setLoading($0) }
return .merge([data, loading])
}
}
func reduce(state: State, mutation: Mutation) -> State {
var newState = state
switch mutation {
case .setData(let data):
newState.data = data
case .setLoading(let isLoading):
newState.isLoading = isLoading
}
return newState
}
}Presentation/{Feature}/ViewControllers/XxxViewController.swift:
import UIKit
import RxSwift
final class XxxViewController: UIViewController {
private let disposeBag = DisposeBag()
func bind(to reactor: XxxReactor) {
// Action ๋ฐ์ธ๋ฉ
self.rx.viewDidLoad
.map { XxxReactor.Action.fetch }
.bind(to: reactor.action)
.disposed(by: disposeBag)
// State ๋ฐ์ธ๋ฉ
reactor.state.map { $0.isLoading }
.bind(to: activityIndicator.rx.isAnimating)
.disposed(by: disposeBag)
}
}Presentation/{Feature}/Views/XxxView.swift
ํด๋น feature์ Coordinator์ Route case ์ถ๊ฐ:
// XxxCoordinator.swift
enum Route {
// ... ๊ธฐ์กด routes
case newScreen(param: SomeType) // ์ route ์ถ๊ฐ
}func transition(for route: Route) {
switch route {
// ... ๊ธฐ์กด cases
case .newScreen(let param):
let viewController = XxxViewController()
viewController.bind(to: XxxReactor(param: param, coordinator: self))
rootViewController.pushViewController(viewController, animated: true)
}
}// ํธ์ถํ๋ ์ธก Reactor์ reduce()
case .someAction:
coordinator?.transition(for: .newScreen(param: data))- Reactor: Action, Mutation, State ์ ์
- Reactor:
mutate(),reduce()๊ตฌํ - ViewController:
bind(to:)๋ฉ์๋ ๊ตฌํ - Coordinator: Route case ์ถ๊ฐ
- Coordinator:
transition(for:)case ๊ตฌํ - ๋ก์ปฌ๋ผ์ด์ ์ด์
:
ko.lproj+en.lproj๋ฌธ์์ด ์ถ๊ฐ - SwiftLint:
swiftlint --config .swiftlint.ymlํต๊ณผ
TurnipPrices feature๋ ํ์ ํด๋ ์์ด flat ๊ตฌ์กฐ. ์ด feature์ ์ถ๊ฐ ์ flat์ผ๋ก ์ ์งํ ๊ฒ. โ gotchas.md #2