1
View Slide
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/// Modelstruct Cinnamon { let value: Int = 0 }enum Event { case increase }45
/// Modelstruct Cinnamon { let value: Int = 0 }enum Event { case increase }func reducer(state: Cinnamon, event: Event) -> Cinnamon {var newState = stateif event == .increase {newState.value += 1}return newState}/// UIlet builder = Form(state: Cinnamon(), reducer: reducer)46
47
48
49
struct AddressBook {var contacts: [Person]var searchTerm: Stringvar scrollPosition: Int}50
struct AddressBookApp {struct Data {var contacts: [Person]}var data: Datastruct UI {var searchTerm: Stringvar scrollPosition: Int}var ui: UI}51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
private var subscribers: [String: (State)->Void] = [:]public func subscribe(_ subscriber: @escaping (State)->Void)-> String {let token = UUID().uuidStringsubscribers[token] = subscribersubscriber(state)return token}66
67
protocol FormComponent {associatedtype Statefunc setup(with state: State)func update(state: State)-> Void}public func subscribe(_ subscriber: Component) -> Stringwhere Component.State == State{...68
69
func subscribe(path: KeyPath,action: @escaping (_ oldValue: Type, _ newValue: Type) -> Void) -> Stringstruct Person { let name: String }form.subscribe(path: \Person.name) { (old, new) in...}70
private var history: [State] = []func apply(_ change: (inout State) -> Void) {states.append(state)change(&state)notifySubscribers()}func undo() {state = history.popLast()notifySubscribers()}71
72
73
74
75
76
77
78
79
80