[SwiftUI]: ForEach не работает для массива словаря, словаря с массивом

Я пытаюсь перебрать массив в 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("")
}

Ошибка: тип протокола «Любой» не может соответствовать «Hashable», поскольку только конкретные типы могут соответствовать протоколам.

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

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


person Nirav Patel    schedule 17.03.2020    source источник


Ответы (2)


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

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.

person Sh_Khan    schedule 17.03.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])
            }

        })
    }

}
person Sorin Lica    schedule 17.03.2020
comment
он показывает ошибку, например, неоднозначную ссылку на член "count" - person Nirav Patel; 17.03.2020
comment
@NiravPatel Пожалуйста, посмотрите мою правку, здесь отображается тип из каждого словаря, протестированного в Xcode 11.3 - person Sorin Lica; 17.03.2020
comment
Спасибо, но я забыл, что было не так раньше? кроме того, как я могу перебирать единицы после этого с тем же ForEach? - person Nirav Patel; 17.03.2020
comment
@NiravPatel Проблема в вашем подходе заключается в том, что тип arr_type2 должен быть Hashable (Dictionary не Hashable). Единицы - это массивы, поэтому вам понадобится еще один ForEach для их итерации, см. Мой отредактированный ответ - person Sorin Lica; 18.03.2020