为什么在 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
   ...
}