자 이번시간에는 TCA 에서 말하는 리듀서에 대해서 정리해 보려고 합니다.
사실 Reducer 패턴에서 한번 정리했던 내용이긴하지만 TCA는 다른 것을 예기할수 있으니 한번 알아보도록 하겠습니다.
위의 문서의 내용을 직역하면 이렇습니다!
"작업이 주어졌을 때 응용 프로그램의 현재 State를 다음 State로 전환하는 방법을 설명하고 나중에 Store에서 실행해야 하는 Effect를 설명하는 프로토콜입니다."
자 상당히 설명이 난해합니다. 천천히 이해해 보도록 하겠습니다.
public protocol Reducer<State, Action> {
associatedtype State
associatedtype Action
associatedtype Body
func reduce(into state: inout State, action: Action) -> Effect<Action>
@ReducerBuilder<State, Action>
var body: Body { get }
}
Reducer는 위와같은 형태로 설계되어 있습니다.
전에 배웠던것을 다시 복습할겸 재설명 해보겠습니다.
State
는 리듀서가 관리하는 상태를 정의합니다.
Action
은 리듀서가 처리하는 액션을 정의합니다. 상태를 변경하기 위해 발생하는 이벤트를 처리합니다.열거형으로 정의하며, 각 케이스에 따라 이벤트를 처리합니다.
Body
는 리듀서의 몸 즉 본체를 정의합니다. SwiftUI의 View에서 Body와 비슷한 개념으로, 리듀서의 액션의 따를 이벤트를 정의합니다.
reduce
메서드는 리듀서의 핵심 메서드로, 상태(State)를 직접 변경하고 액션(Action)을 처리하여 그 결과로 새로운 (Effect)를 반환합니다. Effect는 비동기 작업을 나타내며, 작업이 완료된 후 새로운 액션을 발생시킬 수 있습니다. in-place로 상태를 변경합니다. 즉, 상태가 inout 파라미터로 전달되는 구조이죠.
ReducerBuilder
각 리듀서를 차례로 실행하며, Effect 들을 병함하고, 여러 리듀서를 하나의 리듀서로 결합하는 결과 빌더 입니다.
자 다시 정리해 본다면, 결국 Reducer는 각 상태, 액션을 받아 이에 따른 로직을 구성하는 것 이라고 할수 있겠죠?
Store
는Reducer
의 상태(State)와 액션(Action)을 처리하고, 이를 뷰와 연결하여 UI를 업데이트합니다. 즉 Store는 앱의 상태 저장소이며,Reducer
를 통해 상태와 액션을 관리합니다.
Reducer
가 Store 내에서 액션을 처리하고, 그 결과로 상태를 변경하거나 Effect를 추적합니다.
@Reducer
struct MoreCharacterFeature {
@ObservableState
struct State: Equatable {
...
}
struct ConstViewState: Equatable {
...
}
enum Action {
case viewCycleType(ViewCycleType)
case viewEventType(ViewEventType)
case dataTransType(DataTransType)
case networkType(NetworkType)
case delegate(Delegate)
enum Delegate {
}
/// Binding
case currentText(String)
case currentIndex(Int)
}
enum ViewCycleType {
case onAppear
}
enum ViewEventType {
case onSubmit
}
enum DataTransType {
}
enum NetworkType {
}
var body: some ReducerOf<Self> {
core()
}
}
extension MoreCharacterFeature {
private func core() -> some ReducerOf<Self> {
Reduce { state, action in
switch action {
...
default:
break
}
return .none
}
}
}
자 오늘은 TCA 에서 제공하는 Reducer에 대해서 알아보았습니다
@Reducer 매크로를 설명할까 하였으나 이미 첫시간에 한번 다루었어서 이정도로 마무리 지으려고 합니다.
모두 고생 하셨습니당 이번주도 파이팅 해봐요!!!!