【问题标题】:Why do I get error when I use ForEach in Xcode 11 Beta 5?为什么我在 Xcode 11 Beta 5 中使用 ForEach 时会出错?
【发布时间】:2019-08-04 13:16:37
【问题描述】:
错误信息:
无法推断通用参数“ID”
ForEach(0...self.workoutsViewModel.workoutRoutine[self.workoutIndex].routine[0].exercises.count - 1) { x in
Text("\\(x)")
}
【问题讨论】:
标签:
swift
xcode
swiftui
xcode11
ios13
【解决方案1】:
您作为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)
}
}
【解决方案2】:
@daltonclaybrook 的回答非常棒,因为它解释了您遇到该错误的原因,并说明了创建自定义模型的正确方法。但是,如果您正在寻找一个临时、快速和肮脏的解决方案,这对我在 Xcode 11.2.1 和 iOS 13.2 中适用于 String 数组:
ForEach(strings, id: \.self) { string in
...
}