Arrays SwiftUI中数组的值和标题列表

Arrays SwiftUI中数组的值和标题列表,arrays,swift,list,foreach,swiftui,Arrays,Swift,List,Foreach,Swiftui,我想创建一个列表,每个项目都有一个标题和一个值。数组中的值必须是可变的,以便用户在更改数组中的值时键入新值 目前,我试图通过实现新行而不是使用foreach来伪造它 有一个模型叫做Affiliate,他几乎没有什么财产。每一个都有一个Double作为值。有些只是用来表示除以计算后的值 我想知道如何使用array和foreach,而不是独立创建每个var 我的镜头: struct Affiliate: Codable, Identifiable{ var id = UUID().

我想创建一个列表,每个项目都有一个标题和一个值。数组中的值必须是可变的,以便用户在更改数组中的值时键入新值

目前,我试图通过实现新行而不是使用foreach来伪造它

有一个模型叫做
Affiliate
,他几乎没有什么财产。每一个都有一个
Double
作为值。有些只是用来表示除以计算后的值

我想知道如何使用array和foreach,而不是独立创建每个var

我的镜头:

struct Affiliate: Codable, Identifiable{
    
    var id = UUID().uuidString
    
    var presentOfGoal: Double{
        return actualSales / affiliateGoal
    }
    var hourlyDeal: Double {
        return salesNumber / salePH
    }
    var hourlyOutput: Double{
        return sumSales / workHours
    }
    var averageDeal: Double{
        return sumSales / salesNumber
    }
    var averageIPT: Double {
        return productsNum / salesNumber
    }
    
    var affiliateGoal: Double = 0
    var actualSales: Double = 0
    var salesNumber: Double = 0
    var salePH: Double = 0
    var sumSales: Double = 0
    var workHours: Double = 0
    var productsNum: Double = 0
    var servicePoint: Double = 0
    
}

class AffiliateModel: ObservableObject{
    
    @Published var affiliate: Affiliate
    
    private var session = SessionStore.shared
    
    init(){
        affiliate = self.session.affiliate
    }
    
}
标题:

enum AffiliateGoals: CaseIterable{
    case affiliateGoal, actualSales, salesNumber, salePH, sumSales, workHours, productsNum, servicePoint, presentOfGoal, hourlyDeal, hourlyOutput, averageDeal, averageIPT
    
    var title: String{
        switch self{
        case .affiliateGoal:
            return "Affiliate Goal"
        case .actualSales:
            return "Actual Sales"
        case .salesNumber:
            return "Sales Number"
        case .salePH:
            return "Sales Per Hour"
        case .sumSales:
            return "Sales Summary"
        case .workHours:
            return "Work Hours"
        case .productsNum:
            return "Products Number"
        case .servicePoint:
            return "Service Point"
        case .presentOfGoal:
            return "Present Of Goal"
        case .hourlyDeal:
            return "Hourly Deal"
        case .hourlyOutput:
            return "Hourly Output"
        case .averageDeal:
            return "Average Deal"
        case .averageIPT:
            return "Average Items Per Transaction"
        }
    }
}
意见如下:

struct SetAffiliateGoals: View {
    
    @EnvironmentObject var session: SessionStore
    
    @ObservedObject var model: AffiliateModel
    
    @Binding var show: Bool
    @State private var showAlert = false
    
    let goals = AffiliateGoals.self
    
    var body: some View {
        NavigationView{
            Form{
                Section(header: Text("Fulfill the details:").padding(.top)){
                    SetGoalRow(title: goals.affiliateGoal.title, value: $model.affiliate.affiliateGoal)
                    SetGoalRow(title: goals.actualSales.title, value: $model.affiliate.actualSales)
                    SetGoalRow(title: goals.salePH.title, value: $model.affiliate.salePH)
                    SetGoalRow(title: goals.salesNumber.title, value: $model.affiliate.salesNumber)
                    SetGoalRow(title: goals.sumSales.title, value: $model.affiliate.sumSales)
                    SetGoalRow(title: goals.workHours.title, value: $model.affiliate.workHours)
                    SetGoalRow(title: goals.productsNum.title, value: $model.affiliate.productsNum)
                    SetGoalRow(title: goals.servicePoint.title, value: $model.affiliate.servicePoint)
                }
            }
    }
}

因为这些值是双精度的,所以我尝试创建一个绑定字符串,这样用户就不必在每次键入要应用的值时都按Return按钮

struct SetGoalRow: View{
    
    @State var title: String
    @Binding var value: Double
    let numberFormatter = NumberFormatter()
    
    var amountProxy: Binding<String> {
        Binding<String>(
            get: { String(format: "%.1f", value) },
            set: {
                if let value = numberFormatter.number(from: $0) {
                    self.value = value.doubleValue
                }
            }
        )
    }
    
    var body: some View{
        HStack(spacing: 8){
            Text(LocalizedStringKey(title + ":"))
                .layoutPriority(1)
            TextField(LocalizedStringKey(""), text: amountProxy)
                .keyboardType(.decimalPad)
                .multilineTextAlignment(.trailing)
        }
        .lineLimit(1)
    }

}
struct SetGoalRow:视图{
@状态变量标题:字符串
@绑定变量值:双精度
设numberFormatter=numberFormatter()
var amountProxy:绑定{
装订(
获取:{String(格式:%.1f',value)},
设置:{
如果let value=numberFormatter.number(from:$0){
self.value=value.doubleValue
}
}
)
}
var body:一些观点{
HStack(间距:8){
文本(LocalizedStringKey(标题+“:”))
.优先次序(1)
文本字段(LocalizedStringKey(“”),文本:amountProxy)
.键盘类型(.decimalPad)
.multilitextalignment(.training)
}
.lineLimit(1)
}
}

一个问题不清楚。。。我们要解决什么问题?如何实现相同的结果,而不是创建
SetGoalRow
copy-paste。使用具有标题和值的数组。您可以向枚举中添加一个keyPath属性,该属性返回枚举中每个元素的模型键路径,但这会比当前解决方案的代码少吗?我正在寻找代码更少、更优雅的方法。