SwiftUI ForEach字典识别问题
使用下面给定的代码,我尝试迭代字典SwiftUI ForEach字典识别问题,swiftui,Swiftui,使用下面给定的代码,我尝试迭代字典wordList,但失败的原因是实例方法'identified(by:)'要求'(key:Int,value:[String:String])'符合'Hashable' 因此,我的猜测是,我必须以某种方式将协议Hashable应用于字典的Int,或者可能存在另一种解决方案,它涉及的使用 非常感谢你的帮助 struct ContentView: View { @State var wordOrder = ["DE", "EN"] let word
wordList
,但失败的原因是实例方法'identified(by:)'要求'(key:Int,value:[String:String])'符合'Hashable'
因此,我的猜测是,我必须以某种方式将协议Hashable
应用于字典的Int
,或者可能存在另一种解决方案,它涉及的使用
非常感谢你的帮助
struct ContentView: View {
@State var wordOrder = ["DE", "EN"]
let wordList: [Int: [String: String]] = [
0: [
"DE": "Hallo Welt",
"EN": "hello world"
],
1: [
"DE": "Tschüss",
"EN": "goodbye"
],
2: [
"DE": "vielleicht",
"EN": "maybe"
]
]
var body: some View {
Group {
NavigationView {
List() {
ForEach(wordList.identified(by: \.self)) { wordListEntry in
let lang1 = wordListEntry[wordOrder[0]]
let lang2 = wordListEntry[wordOrder[1]]
WordRow(lang1, lang2)
}
}
.navigationBarTitle(Text("Alle Wörter"))
}
}
}
}
看来你误会了。根据您发布的代码,我猜您认为迭代字典会迭代字典中的值。但字典迭代不是这样工作的
当您迭代字典时,您会收到对。每对包含一个键和字典中相应的值。在您的代码中,wordListEntry
的类型是(key:Int,value:[String:String])
,第一个元素是Int
类型的key
,第二个元素是value
类型的[String:String]
我认为您只需要迭代字典的键,然后在ForEach
正文中查找相应的值,如下所示:
ForEach(wordList.keys.sorted().identified(by: \.self)) { key in
let lang1 = wordListEntry[wordOrder[0]]
let lang2 = wordListEntry[wordOrder[1]]
return WordRow(lang1, lang2)
}
可能的副本不一定。我也检查了另一个问题,这表明了一个可行的方法。但这个答案建议为键和值创建一个数组。我相信上述问题可能有解决方案,不需要这些“旁敲侧击”。但如何克服字典
是无序的,而您试图捕捉数组何时被重新排序的事实?如果Hashable
所做的只是“标识”唯一的数组元素,那么您已经用Dictionary键获得了它!不管怎样,您至少需要一个数组用于List()
order。谢谢。这就是方法:)再问一个问题:我注意到您删除了ForEach循环中的变量。我的代码也因此失败,因为似乎不可能在内部使用var。有什么解决方法吗?我认为使用了@ViewBuilder
的ForEach
,它(从Xcode 11 beta 2开始)不允许使用局部变量。然而,我错了。但是,由于闭包不是单个表达式,因此必须显式使用return
语句。我已经更新了我的答案。哦,现在这是一个严重的限制。希望这将很快得到改善。谢谢你更新你的答案!你能帮我解决这个问题吗