如何在SwiftUI中迭代/遍历数组

10

我有一个字典数组。

let deckColors = [
    ["name": "blue", "desc": "desc1"],
    ["name": "yellow", "desc": "desc2"],
]

我的看法是:
struct ContentView: View {
    var body: some View {
        ForEach(0 ..< deckColors.count) {value in
            Text(deckColors[value]["name"])
        }
    }
}

我该怎么让它工作?目前出现了这个错误:协议类型Any无法符合StringProtocol,因为只有具体类型才能符合协议。

3个回答

10

这种实现结构体的方式似乎非常复杂:

struct DeckColor {
    var name: String
    var desc: String
}

let deckColors = [
    DeckColor(name: "blue", desc: "desc1"),
    DeckColor(name: "yellow", desc: "desc2")
]

struct ContentView: View {
    var body: some View {
        ForEach(0 ..< deckColors.count) { value in
            Text(deckColors[value].name)
        }
    }
}

你实现的方式需要处理字典中不包含"name"值的情况。你可以做到这一点,但它会变得更加丑陋和脆弱:

struct ContentView: View {
    var body: some View {
        ForEach(0 ..< deckColors.count) { value in
            Text(deckColors[value]["name"] ?? "default text if name isn't there.")
        }
    }
}

5

这对我起作用

struct ContentView: View {
    let deckColors = [
        ["name": "blue", "desc": "desc1"],
        ["name": "yellow", "desc": "desc2"],
    ]

    var body: some View {
        ForEach(0 ..< deckColors.count, id: \.self) {value in
            Text(String(self.deckColors[value]["name"]!))
        }
    }
}

1
我建议将您的卡组颜色放入枚举中,然后对其进行迭代。
enum DeckColor: String, CaseIterable {
    case blue
    case yellow

    var desc: String {
        switch self {
            case .blue: return "desc1"
            case .yellow: return "desc2"
        }
    }
}

struct ContentView: View {
    var body: some View {
        VStack(alignment: .leading) {
            ForEach(DeckColor.allCases, id: \.self) { color in
                Text(color.rawValue)
            }
        }
    }
}

这将导致显示描述而不是颜色名称。 - Leo Dabus
我更喜欢Rob Napier提出的建议。但是,无论如何,您需要将枚举声明为enum DeckColor:String,CaseIterable {并将颜色rawValue传递给Text初始化程序。 Text(color.rawValue) - Leo Dabus
我建议使用枚举而不是结构体的原因是,使用结构体时,每次应用程序运行时都必须运行初始化代码,随着“deckColors”越来越多,这变得越来越麻烦。如果您想在整个应用程序中访问它们,则必须每次创建它们,或者创建它们的单例。枚举提供公共访问、静态和类型安全性。 - tempest_fiend
当我运行你的代码时,出现了这个错误:无法将类型为'Text'的值转换为闭包结果类型'Void' - user2641891
我当时在手机上看,完全忽略了它是为SwifUI设计的.. 已经更新 :) - tempest_fiend
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接