【发布时间】:2021-12-22 21:57:38
【问题描述】:
我不清楚如何将以下计算属性的输出组合到 UI。
var isComplete: Bool {
Set([.givenName, .familyName]).isSubset(of: elements)
}
如果上述更改,我基本上希望用户界面更新。我将如何使用 Combine 来做到这一点?
反应式编程要求我现在向后思考,我在考虑模型 >> UI 时遇到了麻烦。
这是上下文中的代码。
struct EditPersonView: View {
let model: ViewModel
private var captionView: some View {
HStack {
/*
stuff
*/
if submitted && model.name.isComplete {
Spacer()
Text("select".localizedCapitalized) + Text(" ") + Text("save") + Text(" ") + Text("????")
}
}
}
var body: some View {
/*
stuff - including captionView
*/
}
}
extension EditPersonView {
final class ViewModel {
let name: PersonName
init(person: Person) {
self.name = PersonName(for: person)
}
}
}
extension EditPersonView.ViewModel {
final class PersonName {
let person: Person
private let formatter = PersonNameComponentsFormatter()
init(for person: Person) {
self.person = person
}
var text: String {
get { person.name ?? "" }
set { person.name = newValue }
}
private var components: PersonNameComponents? {
formatter.personNameComponents(from: text)
}
var givenName: String? {
components?.givenName
}
var familyName: String? {
components?.familyName
}
private func isValid(component: String?) -> Bool {
if let name = component, name.count > 1 {
return true
}
return false
}
var elements: Set<Elements> {
var collection = Set<Elements>()
if isValid(component: givenName) { collection.insert(.givenName) }
if isValid(component: familyName) { collection.insert(.familyName) }
return collection
}
var isComplete: Bool {
Set([.givenName, .familyName]).isSubset(of: elements)
}
}
}
extension EditPersonView.ViewModel.PersonName {
enum Elements {
case givenName, familyName
}
}
【问题讨论】:
-
为什么不使用 ObservableObject 作为类和 @Published var isComplete ?