es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo mostrar una matriz de este archivo JSON local como una lista de SwiftUI en una vista?

Por ejemplo, ¿cómo muestro los descriptores para cada registro en una lista, como sigue:

NUTTY, FRUITY
FATTY
FRUITY

(Tenga en cuenta que hice los descriptores opcionales en mi modelo porque la matriz podría estar vacía)

Aquí está mi código de archivo JSON del archivo llamado flavors.json:

[
{
“id”: “U45773”,
“flavorGroup”: “CASHEW”,
“name”: “NATURAL CASHEW FLAVORING”,
“isBeer”: true,
“isSeltzer”: true,
“isNatural”: true,
“descriptors”: [“NUTTY”, “FRUITY”],
“keywords”: [“aromatic”, “fattt-buttery”, “brown”, “nutty”, “roasted”, “creamy”]
},
{
“id”: “U63639”,
“flavorGroup”: “BLACK WALNUT”,
“name”: “NATURAL AND ARTIFICIAL WALNUT FLAVOR”,
“isBeer”: true,
“isSeltzer”: false,
“isNatural”: true,
“descriptors”: [“FATTY”],
“keywords”: [“sweet”, “molasses”, “woody”, “slight dried fruit (amber ale)”]
},
{
“id”: “562811”,
“flavorGroup”: “APRICOT”,
“name”: “NATURAL AND ARTIFICIAL APRICOT FLAVOR”,
“isBeer”: true,
“isSeltzer”: false,
“isNatural”: true,
“descriptors”: [“FRUITY”],
“keywords”: [“juicy”, “skunky”, “peach”, “floral”, “slight green (sierra nevada pale ale)”]
}
]

Aquí está mi código de modelo:

struct Flavor: Codable, Identifiable {
enum CodingKeys: CodingKey {
case id
case flavorGroup
case name
case isBeer
case isSeltzer
case isNatural
case descriptors
case keywords
}
let id, flavorGroup, name: String
let isBeer, isSeltzer, isNatural: Bool
let descriptors, keywords: [String]?
}

Aquí está mi código de modelo de vista:

class ReadData: ObservableObject {
@Published var flavors = Flavor
init(){
loadData()
}
func loadData() {
guard let url = Bundle.main.url(forResource: “flavors”, withExtension: “json”)
else {
print(“Archivo Json no encontrado”)
return
}
let data = try? Data(contentsOf: url)
let flavors = try? JSONDecoder().decode([Flavor].self, from: data!)
self.flavors = flavors!
}
}

Este es mi mejor intento de código de vista:

struct DescriptorListView: View {
@ObservedObject var datas = ReadData()
var body: some View {
List(datas.flavors) { item in
ForEach(item.descriptors ?? [], id: .self) { descriptor in
Text(“- (descriptor)”)
}
}
}
}

Produce estos errores de compilador que no entiendo cómo solucionar:

El valor del tipo opcional ‘[String]?’ debe desempaquetarse en un valor del tipo ‘[String]’

Agrupe usando ‘??’ para proporcionar un valor predeterminado cuando el valor opcional contenga ‘nil’

Desenvuelve forzosamente usando ‘!’ para abortar la ejecución si el valor opcional contiene ‘nil’

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Aquí está el código de vista actualizado:

    struct DescriptorListView: View {
        @ObservedObject var datas = ReadData()
        var body: some View {
            List(datas.flavors) { item in
                ForEach(item.descriptors ?? [], id: \.self) { descriptor in
                    Text("- \(descriptor)")
                }
            }
        }
    }
    

    Esto mostrará los descriptores de cada registro en una lista, como:

    • NUTTY, FRUITY
    • FATTY
    • FRUITY

Comments are closed.