typealias State = Int
enum Event {
case increase
case decrease
}
func reduce(_ state: State, event: Event) -> State {
switch event {
case .increase:
return state + 1
case .decrease:
return state - 1
}
}
首先,我们得有个状态:
typealias State = Int
然后,我们要有各种事件:
enum Event {
case increase
case decrease
}
func reduce(_ state: State, event: Event) -> State {
switch event {
case .increase:
return state + 1
case .decrease:
return state - 1
}
}
typealias UserID = String
enum LoginError: Error, Equatable {
case usernamePasswordMismatch
case offline
}
struct State: Equatable {
var username: String
var password: String
var loading: Bool
var data: UserID?
var error: LoginError?
enum Event {
case onUpateUsername(String)
case onUpatePassword(String)
case onTriggerLogin
case onLoginSuccess(UserID)
case onLoginError(LoginError)
}
static func reduce(_ state: State, event: Event) -> State {
var newState = state
switch event {
case .onUpateUsername(let username):
newState.username = username
case .onUpatePassword(let password):
newState.password = password
case .onTriggerLogin:
newState.loading = true
newState.data = nil
newState.error = nil
case .onLoginSuccess(let userId):
newState.loading = false
newState.data = userId
case .onLoginError(let error):
newState.loading = false
newState.error = error
}
return newState
}
}
首先,我们得有个状态:
struct State: Equatable {
var username: String // 输入的用户名
var password: String // 输入的密码
var loading: Bool // 登录中
var data: UserID? // 登录成功
var error: LoginError? // 登录失败
...
}
然后,我们要有各种事件:
enum Event {
case onUpateUsername(String) // 更新用户名
case onUpatePassword(String) // 更新密码
case onTriggerLogin // 触发登录
case onLoginSuccess(UserID) // 登录成功
case onLoginError(LoginError) // 登录失败
}
static func reduce(_ state: State, event: Event) -> State {
var newState = state
switch event {
case .onUpateUsername(let username):
newState.username = username
case .onUpatePassword(let password):
newState.password = password
case .onTriggerLogin:
newState.loading = true
newState.data = nil
newState.error = nil
case .onLoginSuccess(let userId):
newState.loading = false
newState.data = userId
case .onLoginError(let error):
newState.loading = false
newState.error = error
}
return newState
}