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
语句。我已经更新了我的答案。哦,现在这是一个严重的限制。希望这将很快得到改善。谢谢你更新你的答案!你能帮我解决这个问题吗