11. Andto derive newstates
1> let a = Property(value: 1.0)
2> let b = a.map { value in "(value) as String" }
4> b.value
"1.0 as String"
5> a.value = a.value * 10
6> a.value
10.0
7> b.value
"10.0 as String"
11
14. // Sign-Up Table View DataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 12
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
// Facebook button
case 1:
// Or text
case 2:
// First Name
case 3:
// Last Name
...
}
}
14
15. Adding or removing elements requires:
» update the total number of elements
» shift all indices affected
Moving elements requires:
» shift all indices affected
15
32. » Text
» Text Input
» Password
» Selection
» Buttons
» ...
32
33. enum Component {
case text(String)
case textInput(placeholder: String, ...)
case password(placeholder: String, ...)
case selection(...)
case button(title: String, ...)
case facebookButton(...)
case toggle(title: String, ...)
...
}
33
48. enum SignInType {
case standard
case membership
}
class SignInViewModel: Form {
let components: Property<[Component]>
init(...) {
self.components = ??? !
}
}
48
51. enum Component: FormComponent {
...
case toggle(title: String, isOn: Property<Bool>)
...
}
Nowwe can define component's initialvalue
and observeanychanges
51
52. enum SignInType {
case standard
case membership
}
class SignInViewModel: Form {
private isMembershipSelected = Property(value: false)
let components: Property<[Component]>
init(...) {
self.components = ??? !
}
}
52
53. enum SignInType { case standard, membership }
class SignInViewModel: Form {
private isMembershipSelected = Property(value: false)
private signInType: Property<SignInType>
let components: Property<[Component]>
init(...) {
self.signInType = isMembershipSelected.map { isSelected in
return isSelected ? .membership : .standard
}
self.components = ??? !
}
}
53
54. enum SignInType { case standard, membership }
class SignInViewModel: Form {
private isMembershipSelected = Property(value: false)
private signInType: Property<SignInType>
let components: Property<[Component]>
init(...) {
self.signInType = ...
self.components = signInType.map { signInType in
switch signInType {
case .standard:
...
case .membership:
...
}
}
}
}
54
55. self.components = signInType.map { signInType in
switch signInType {
case .standard: return [
...
.toggle(
title: "Sign-In with Membership ID",
isOn: isMembershipSelected
)
...
]
case .membership: return [
...
.toggle(
title: "Sign-In with Membership ID",
isOn: isMembershipSelected
)
...
]
}
}
55