将用户数据保存到Struct内部的数组中



我想将输入的用户数据/变量正确保存在一个数组中,该数组位于结构中,但无法使其工作。

目前,我有几个结构:

struct Household: Codable {
let id  = UUID()
var region: String
var householdSize: Int = 1
var receivingBenefits: [String]
var energyCrisis: Bool
var utilityProviders: [String]
var residenceType: String
var propertyTaxPastDue, homeNeedsRepairs, filedPreviousYearTaxReturn, heatingSystemNeedsRepairs: Bool
var atRiskOfHomelessness: Bool
var receivedMaximumBenefit: ReceivedMaximumBenefit
var personDetails: [PersonDetail]
var incomes: [Income]
var assets: [Asset]
enum CodingKeys: String, CodingKey {
case region
case householdSize = "household_size"
case receivingBenefits = "receiving_benefits"
case energyCrisis = "energy_crisis"
case utilityProviders = "utility_providers"
case residenceType = "residence_type"
case propertyTaxPastDue = "property_tax_past_due"
case homeNeedsRepairs = "home_needs_repairs"
case filedPreviousYearTaxReturn = "filed_previous_year_tax_return"
case heatingSystemNeedsRepairs = "heating_system_needs_repairs"
case atRiskOfHomelessness = "at_risk_of_homelessness"
case receivedMaximumBenefit = "received_maximum_benefit"
case personDetails = "person_details"
case incomes, assets
}
}
struct PersonDetail: Codable, Identifiable {
let id  = UUID()  // <-- here
var age: Int = 18
var maritalStatus: String = ""
var minimumEmploymentOverExtendedPeriod: Bool
var workStatus: String = ""
var pregnant: Bool
var attendingSchool: Bool = false
var disabled: Bool
enum CodingKeys: String, CodingKey {
case age
case maritalStatus = "marital_status"
case minimumEmploymentOverExtendedPeriod = "minimum_employment_over_extended_period"
case workStatus = "work_status"
case pregnant
case attendingSchool = "attending_school"
case disabled
}
}
class Base: ObservableObject, Codable {
@Published var household: Household
enum CodingKeys: String, CodingKey {
case household = "household"
}
}

现在,我可以很容易地将Textfield、toggle或Picker绑定到Household结构下的任何东西,例如,我认为在下面的结构中,可以通过Base((类中的family轻松连接。。

HStack() {
Image(systemName:"wrench.and.screwdriver.fill")
.frame(width: 15, height: 15)
Toggle(isOn: $eligBase.household.homeNeedsRepairs) {
Text("Need Home Repairs?")
.font(.system(size: 15))
}.tint(.blue)
}

但是,我无法连接数组`[PersonDetail]中的任何内容,我包含了该结构。

例如,如果我想为"PersonDetail"中禁用的变量连接一个Toggle,我会得到一个错误,这是我禁用的Toggle:

Toggle(isOn: $eligBase.household.personDetails.disabled) {
Text("Disabled")
.font(.system(size: 15))
......
}

我收到一个错误:

类型为"Binding<[PersonDetail]>'没有动态成员使用根类型"[PersonDetail]"中的密钥路径"disabled">

知道如何将Toggles、Textfield、Picker连接到结构中的数组中的变量吗?

您可以将List用于PersonDetail的数组,例如本例中的代码:

编辑:

struct ContentView: View {
@StateObject var eligBase = Base()

var body: some View {
List {
let _ = print("n---> (eligBase.household.personDetails.count) n")
Section("About You") {
ForEach($eligBase.household.personDetails) { $person in
HStack {
Text("Age")
Spacer()
Picker("", selection: $person.age) {
ForEach(0...100, id: .self) {
Text("($0)")
}
}.pickerStyle(.menu)
}
HStack {
Text("Marital Status")
Spacer()
Picker("", selection: $person.maritalStatus) {
ForEach(0...3, id: .self) {
Text("($0)")
}
}.pickerStyle(.menu)
}
}
}
}
.onAppear {
eligBase.household = Household(region: "xyz", householdSize: 0, receivingBenefits: [], energyCrisis: false, utilityProviders: [], residenceType: "", propertyTaxPastDue: false, homeNeedsRepairs: false, filedPreviousYearTaxReturn: false, heatingSystemNeedsRepairs: false, atRiskOfHomelessness: false, receivedMaximumBenefit: ReceivedMaximumBenefit(cip: false), personDetails: [PersonDetail(age: 33, maritalStatus: "single", minimumEmploymentOverExtendedPeriod: true, workStatus: "ok", pregnant: false, attendingSchool: false, disabled: false), PersonDetail(age: 44, maritalStatus: "maried", minimumEmploymentOverExtendedPeriod: true, workStatus: "ok", pregnant: false, attendingSchool: false, disabled: true)], incomes: [], assets: [])
}
} 

您试图将控件绑定到整个PersonDetail数组,而不是数组中的单个条目。

例如,如果您一直想使用数组中的第一个personDetail实例:

Toggle(isOn: $eligBase.household.personDetails.first!.disabled) {
Text("Disabled")
.font(.system(size: 15))

在实际的解决方案中,您可能希望安全地展开数组中想要的任何PersonDetail实例,并干净地处理数组为空的情况(因为在我的示例中,如果数组为空,强制展开会崩溃(。

最新更新