如何在ForEach循环中使用Identifiable

时间:2019-07-12 04:02:38

标签: swiftui

我正在尝试遍历对象数组。该对象符合可识别协议。使用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
}

(此代码已抽象)

2 个答案:

答案 0 :(得分:3)

您需要了解的第一件事是,在构建视图时,编译错误可能会引起很大的误导。错误可能显示在代码的底部,但原因可能在顶部。我希望这个问题将来会解决,但是暂时,您需要小心。

您的代码可以很好地编译。由于我所说的关于误导性错误的说法,一种解决问题的 brute 有效方法是开始注释一些代码,直到错误消失。这可以让您指出问题的根源所在。

更新问题的一种好方法是包含足够的代码,以便人们可以仅通过复制并粘贴到自己的Xcode中来重现问题。这可能对您来说是很多工作,但我发现大多数时候,您都了解该过程中的问题,甚至可能根本不需要发布问题。将问题减少到最低限度,也是了解/解决问题的好方法。

更新

由于您添加了更多代码,因此错误显示了您不希望出现的地方:

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

   ScrollView(.horizontal, showsIndicators: false)

还有可能潜在的问题。您正在使用:

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

但是你不是说:

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

如果是这样,则由于Item已经是Identifiable,因此您不需要使用已标识,因此已经由ID标识了。

self.items

答案 1 :(得分:0)

问题实际上出在以下几行:

ScrollView(showsHorizontalIndicator: false)

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

ScrollView(.horizontal, showsIndicators: false)

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