Как перебрать массив foreach в SwiftUI - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть этот массив словарей.

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 ]

4 голосов
/ 17 февраля 2020

Это кажется очень сложным способом реализации структуры:

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". Вы можете сделать это, но это уродливее и больше от agile:

struct ContentView: View {
    var body: some View {
        ForEach(0 ..< deckColors.count) { value in
            Text(deckColors[value]["name"] ?? "default text if name isn't there.")
        }
    }
}
1 голос
/ 17 февраля 2020

Я бы поместил цвета вашей колоды в перечисление, а затем повторил бы это.

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)
            }
        }
    }
}
0 голосов
/ 17 февраля 2020

Это работает для меня

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"]!))
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...