为啥我在 Xcode 11 Beta 5 中使用 ForEach 时会出错?

Posted

技术标签:

【中文标题】为啥我在 Xcode 11 Beta 5 中使用 ForEach 时会出错?【英文标题】: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)")


【问题讨论】:

信息太少了,任何人都无法帮助您。 【参考方案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】:

@daltonclay*** 的回答非常棒,因为它解释了您遇到该错误的原因,并说明了创建自定义模型的正确方法。但是,如果您正在寻找一个临时、快速和肮脏的解决方案,这对我在 Xcode 11.2.1 和 ios 13.2 中适用于 String 数组:

ForEach(strings, id: \.self)  string in
   ...

【讨论】:

以上是关于为啥我在 Xcode 11 Beta 5 中使用 ForEach 时会出错?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 xcode 6 beta 中得到“必须将自动调整大小掩码转换为约束才能拥有 _setHostsLayoutEngine:YES”

在 Xcode 9 beta 5 中激活“焦点跟随选择”?

Xcode 11 beta:AppDelegate 文件没有窗口全局变量

如何打开 .plist 文件作为源代码 xcode 11 beta 5

.send() 和 .sink() 似乎不再适用于 Xcode 11 Beta 5 中的 PassthroughSubject

Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃