【问题标题】:How to use Identifiable in a ForEach loop如何在 ForEach 循环中使用 Identifiable
【发布时间】:2019-11-21 19:29:57
【问题描述】:

我正在尝试遍历对象数组。此对象符合 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
}

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

【问题讨论】:

  • 您的代码编译得很好,但是您在示例中留下了很多代码,所以我不得不自己创建缺少的部分。请包含更多代码,特别是您的 Identifiable 类型。还有一点上下文。否则无法为您提供帮助。
  • @kontiki 感谢您的反馈。我添加了我的可识别类型。你在寻找什么样的其他背景?我正在努力提高提问的能力,所以请告诉我。
  • 更多上下文我的意思是更多围绕 ForEach 的代码。但是,根据您添加的新信息,我发现了一个问题。让我将其发布到答案中。
  • 我发布了一个答案,指出了一些潜在的问题。另外,既然你问,要写出更好的问题,请检查:stackoverflow.com/help/how-to-ask
  • @kontiki 谢谢!我认为一个潜在的问题是我对问题的理解不足以首先提出问题。感谢您的指导!

标签: swiftui


【解决方案1】:

您需要知道的第一件事是,在构建视图时,编译错误可能会非常具有误导性。代码底部可能会显示错误,但原因可能在顶部。我预计这将在未来的某个时候得到解决,但目前,您需要小心。

您的代码编译得很好。由于我所说的误导性错误,调试问题的一种粗暴但有效的技术是开始注释代码位,直到错误消失。这样可以准确指出问题的根源所在。

更新问题的一个好方法是包含足够的代码,这样人们只需复制并粘贴到他们自己的 Xcode 中即可重现问题。这对你来说可能是很多工作,但我发现大多数时候,你在这个过程中理解了问题,你甚至可能不需要一开始就发布问题。将问题降到最低限度也是理解/解决问题的好方法。

更新

由于您添加了更多代码,错误显示在您未预料到的位置:

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

   ScrollView(.horizontal, showsIndicators: false)

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

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

但你不是说:

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

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

self.items

【讨论】:

  • 好收获。这是我抽象代码时的错误。这应该是一种看法。我道歉。谢谢你抓住那个。我已经更新了帖子。
  • 我在回答中添加了一些提示。
  • 不客气。我更新了我的答案以添加关于您使用 identifiable 的另一个提示。
【解决方案2】:

问题实际上在于以下行:

ScrollView(showsHorizontalIndicator: false)

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

ScrollView(.horizontal, showsIndicators: false)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2015-07-04
    • 2023-03-27
    • 2015-05-04
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多