如何在 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)
这将为您提供水平滚动视图,并且不会显示滚动指示器。
我正在尝试遍历对象数组。该对象符合 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)
这将为您提供水平滚动视图,并且不会显示滚动指示器。