如何在 ForEach 循环中使用 Identifiable

How to use Identifiable in a ForEach loop

我正在尝试遍历对象数组。该对象符合 Identifiable 协议。使用 ForEach 循环时,出现以下错误:Type of expression is ambiguous without more context

我已经包含了引发错误的代码块。该错误特别强调 \.name。我错过了什么吗?

另一个注意事项:此代码在 Xcode 11 Beta 2 中有效,但在 Xcode 11 Beta 3 中失效...

struct ItemRow : View {

    var categoryName:String
    var items:[Item]

    var body: some View {
        VStack {
            Text(self.categoryName)
                .font(.title)

            ScrollView(showsHorizontalIndicator: false) {
                HStack (alignment: .top){
                    ForEach (self.items.identified(by: \.name)) { item in
                        NavigationLink(destination: ItemDetail(item: item)) {
                            ItemView(item: item)
                                .frame(width:300)
                                .padding(.trailing, 30)
                        }
                    }
                }
            }
        }
    }
}

这是可识别对象:

struct Item:Hashable, Codable, Identifiable {
    var id:Int
    var name:String
    var category:Category
    var description:String
}

(这段代码已经抽象出来)

您需要知道的第一件事是,在构建视图时,编译错误可能会产生误导。错误可能显示在代码的底部,但原因可能在顶部。我希望这个问题会在未来的某个时候得到修复,但目前,你需要小心。

你的代码编译得很好。由于我所说的误导性错误,一种粗暴但有效的调试问题的技术是开始注释代码位,直到错误消失。这将使查明问题的根源可能在哪里。

更新您的问题的一个好方法是包括足够的代码,这样人们就可以通过复制并粘贴到他们自己的 Xcode 中来重现问题。这对你来说可能是很多工作,但我发现大多数时候,你在那个过程中理解了问题,你甚至可能不需要首先 post 这个问题。将问题减少到最小表达方式,也是 understading/fixing 问题的好方法。

更新

由于您添加了更多代码,错误显示在您意想不到的地方:

您使用的 ScrollView 初始化器已被弃用。现在看起来像这样:

   ScrollView(.horizontal, showsIndicators: false)

也可能是个问题。您正在使用:

self.items.identified(by: \.name)

但你不是说:

self.items.identified(by: \.id)

如果是这样,那么您不需要使用 identified,因为 Item 已经是 Identifiable,因此,它已经被 id 识别。

self.items

问题实际上出在以下行:

ScrollView(showsHorizontalIndicator: false)

ScrollView 在 Beta 3 中不再那样工作了。参数现在看起来像这样:

ScrollView(.horizontal, showsIndicators: false)

这将为您提供水平滚动视图,并且不会显示滚动指示器。