为什么在 Xcode 11 Beta 5 中使用 ForEach 时出现错误?
Why do I get error when I use ForEach in Xcode 11 Beta 5?
错误信息:
Generic parameter 'ID' could not be inferred
ForEach(0...self.workoutsViewModel.workoutRoutine[self.workoutIndex].routine[0].exercises.count - 1) { x in
Text("\(x)")
}
您作为 ForEach
的第一个参数传递的集合中的元素必须符合 Identifiable
,或者您必须使用不同的初始化程序来指定 KeyPath
上的 id你的元素。例如,以下代码无法编译:
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
:
ForEach(strings, id: \.self) { string in
...
}
错误信息:
Generic parameter 'ID' could not be inferred
ForEach(0...self.workoutsViewModel.workoutRoutine[self.workoutIndex].routine[0].exercises.count - 1) { x in
Text("\(x)")
}
您作为 ForEach
的第一个参数传递的集合中的元素必须符合 Identifiable
,或者您必须使用不同的初始化程序来指定 KeyPath
上的 id你的元素。例如,以下代码无法编译:
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
:
ForEach(strings, id: \.self) { string in
...
}