我正在尝试遍历对象数组。该对象符合可识别协议。使用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
}
(此代码已抽象)
答案 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)
这将为您提供水平滚动视图,并且不会显示滚动指示器。