swift 无法将元组传递到列表视图

rks48beu  于 2023-01-25  发布在  Swift
关注(0)|答案(2)|浏览(127)

我有一个应用程序,它的UI是用StoryBoard构建的,我现在正尝试将它转换成SwiftUI。我遇到的问题是,这个应用程序主要由通过Tableviews传递的元组数据数组组成。然而,在SwiftUI中,我找不到将元组数据传递到列表视图的方法。我一直收到以下错误消息:
类型“(String,String,String)”不能符合“哈希表”;只有struct/enum/class类型可以符合协议。
我试着通过结构体传递我的元组数组,看看我是否可以让它那样工作,但无法通过结构体有效地解码元组数组。有人有什么想法吗?我的代码目前如下:

struct Result: View {
    
    let tupleArray = [("a", "z", "c"), ("e", "x", "d"), ("c", "y", "x")]

    var body: some View {
        NavigationView {
            List {
                ForEach(self.tupleArray, id: \.self) { item in
                    ResultsRowView(text0: item.0, text1: item.1, text2: item.2)
                }
            }//:LOOP
        }
    }
}

我的列表行视图如下:

struct ResultsRowView: View {
    
    var text0 = "a"
    var text1 = "b"
    var text2 = "c"
    
    var body: some View {
        HStack(alignment: .center) {
            Text(text0)
            Text(text1)
            Text(text2)
        } //:HSTACK
    }
}
vojdkbi0

vojdkbi01#

在Swift中,元组不能符合Hashable-参见How do I make (Int,Int) Hashable?
你得到的错误就是:
只有struct/enum/class类型可以符合协议。
一种可能的解决方案是创建符合Hashable的自定义结构:

struct Model: Hashable {
    let item1: String
    let item2: String
    let item3: String
}

像这样使用它:

struct Result: View {
    let tupleArray = [("a", "z", "c"), ("e", "x", "d"), ("c", "y", "x")]
        .map(Model.init)

    var body: some View {
        NavigationView {
            List {
                ForEach(self.tupleArray, id: \.self) { item in
                    ResultsRowView(text0: item.item1, text1: item.item2, text2: item.item3)
                }
            }
        }
    }
}

注意:您可以使用.map(Model.init)轻松地将元组数组转换为Model对象数组。

s5a0g9ez

s5a0g9ez2#

ForEach(tupleArray.indices, id: \.self) { index in
    let item = tupleArray[index]
    ResultsRowView(text0: item.0, text1: item.1, text2: item.2)
}

或者,您可以通过索引访问元组数组,以便符合可识别的要求。

相关问题