[SwiftUI]: ForEach не работает для массива словаря, словарь с массивом - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь перебрать массив в SwiftUI, но он не работает нормально.

Мой код:

let arr_type2  = [
                    ["type":"Temperature","Units":["°C","°F","°K"]],
                    ["type":"Length","Units":["m","km","ft","yd","mi"]],
                    ["type":"Time","Units":["sec","min","hr","day"]],
                    ["type":"Volume","Units":["ml","lt","cups","pints","gallons"]]
                    ]

ForEach(arr_type2, id: \.self) { dict in //Error
        Text("")
}

Ошибка: тип протокола 'Any' не может соответствовать 'Hashable' протоколы могут соответствовать только конкретным типам

Я только начал изучать SwiftUI, не могли бы вы помочь мне сохранить это?

Спасибо за ваше драгоценное время!

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Вы можете использовать ForEach вот так

 var body: some View {
    let arr_type2  = [
        ["type":"Temperature","Units":["°C","°F","°K"]],
        ["type":"Length","Units":["m","km","ft","yd","mi"]],
        ["type":"Time","Units":["sec","min","hr","day"]],
        ["type":"Volume","Units":["ml","lt","cups","pints","gallons"]]
    ]

    return ForEach(0..<arr_type2.count, id: \.self) { index -> AnyView in
        let units = arr_type2[index]["Units"] as! [String]
        return AnyView(VStack {
            Text(arr_type2[index]["type"] as! String)
            ForEach(0..<units.count, id: \.self) { indexUnits in
                 Text(units[indexUnits])
            }

        })
    }

}
2 голосов
/ 17 марта 2020

Вы можете написать это чисто с помощью

struct Model:Hashable {
    let type:String
    let unnits:[String]
}

struct ContentView: View {

    let arr_type2 = [Model(type:"Temperature", unnits: ["°C","°F","°K"])]

    var body: some View {
           ForEach(arr_type2, id: \.self) { item in

            Text(item.type)
        }
    }
}

. Зачем проверять https://www.hackingwithswift.com/books/ios-swiftui/why-does-self-work-for-foreach

...