错误消息:
无法推断
的通用参数'id'
ForEach(0...self.workoutsViewModel.workoutRoutine[self.workoutIndex].routine[0].exercises.count - 1) { x in
Text("\(x)")
}
您传递的集合中的元素,因为ForEach
的第一个参数必须符合Identifiable
,否则您必须使用其他初始器来指定元素上ID的KeyPath
。例如,以下代码不编译:
struct MyModel {
let name: String
}
struct ContentView: View {
let models: [MyModel]
var body: some View {
ForEach(models) { model in
Text(model.name)
}
}
}
models
数组不满足ForEach
初始化器的要求,即,其元素不符合Identifiable
。我可以通过两种方式之一解决此问题:
1。(扩展MyModel
以符合Identifiable
:
extension MyModel: Identifiable {
// assuming `name` is unique, it can be used as our identifier
var id: String { name }
}
2。(使用ForEach
上的便利性初始化器,使您可以为标识符指定KeyPath
:
var body: some View {
ForEach(models, id: .name) { model in
Text(model.name)
}
}
@daltonclaybrook的答案很棒,因为它解释了为什么您会遇到该错误并说明创建自定义模型的正确方法。但是,如果您正在寻找一个临时,快速且肮脏的解决方案,则在Xcode 11.2.1和iOS 13.2中为String
的iOS 13.2有效:
ForEach(strings, id: .self) { string in
...
}