SwiftUI 无法将字符串传递给 KeyPath
SwiftUI Can't Pass String to KeyPath
我有一个应用程序引用了我从外部加载的大型数据集 public
站点作为逗号分隔值文件。我将数据解析为一个名为模型的数组
水点模型。缩写版本是:
struct WaterPointModel: Identifiable {
let id = UUID()
let STATE: String
let COUNTY: String
let AQWFrTo: Double
let AQWGWSa: Double
let AQWGWTo: Double
//many more
}
然后我想总结(减少)数据。我的功能是:
func sumOnAttributeUSList(sumField: KeyPath<WaterPointModel,Double>) -> Double {
return dataStore.waterPointModels.map({ [=11=][keyPath:sumField] }).reduce(0, +)
}
接下来我要调用它来构建报告:
let aqWFrTo = sumOnAttributeUSList(sumField: \.AQWFrTo)
一切正常。但是还有其他报告我需要将字符串传递给
创建该键路径。假设我有一个查找 table,我在其中查找“abc”并获得“AQWFrTo”。我
想在循环中做这样的事情:
let abc = "AQWFrTo"
let aqWFrTo = sumOnAttributeUSList(sumField: \WaterPointModel.abc)
我无法制作此作品的任何版本。任何指导将不胜感激。
Xcode13.3.1,iOS15.4
一个简单的方法是这样的:
func toKeypath(_ str: String) -> KeyPath<WaterPointModel,Double>? { // <-- with or without optional
switch str {
case "AQWFrTo": return \.AQWFrTo
case "AQWGWSa": return \.AQWGWSa
case "AQWGWTo": return \.AQWGWTo
// ...
default: return nil // <-- or a default Keypath
}
}
let aqWFrTo = sumOnAttributeUSList(sumField: toKeypath("AQWFrTo"))
我有一个应用程序引用了我从外部加载的大型数据集 public 站点作为逗号分隔值文件。我将数据解析为一个名为模型的数组 水点模型。缩写版本是:
struct WaterPointModel: Identifiable {
let id = UUID()
let STATE: String
let COUNTY: String
let AQWFrTo: Double
let AQWGWSa: Double
let AQWGWTo: Double
//many more
}
然后我想总结(减少)数据。我的功能是:
func sumOnAttributeUSList(sumField: KeyPath<WaterPointModel,Double>) -> Double {
return dataStore.waterPointModels.map({ [=11=][keyPath:sumField] }).reduce(0, +)
}
接下来我要调用它来构建报告:
let aqWFrTo = sumOnAttributeUSList(sumField: \.AQWFrTo)
一切正常。但是还有其他报告我需要将字符串传递给 创建该键路径。假设我有一个查找 table,我在其中查找“abc”并获得“AQWFrTo”。我 想在循环中做这样的事情:
let abc = "AQWFrTo"
let aqWFrTo = sumOnAttributeUSList(sumField: \WaterPointModel.abc)
我无法制作此作品的任何版本。任何指导将不胜感激。
Xcode13.3.1,iOS15.4
一个简单的方法是这样的:
func toKeypath(_ str: String) -> KeyPath<WaterPointModel,Double>? { // <-- with or without optional
switch str {
case "AQWFrTo": return \.AQWFrTo
case "AQWGWSa": return \.AQWGWSa
case "AQWGWTo": return \.AQWGWTo
// ...
default: return nil // <-- or a default Keypath
}
}
let aqWFrTo = sumOnAttributeUSList(sumField: toKeypath("AQWFrTo"))