Comment créer une structure personnalisée pour affecter le contenu du tableau dans des variables utilisables?

J'ai une fonction JSON qui a précédemment mappé le contenu d'un tableau ( counsortinges , divisions , teams (non montré)) en variables séparées en utilisant ce code:

 let task = URLSession.shared.dataTask{ (response: URLResponse?, error: Error?) in DispatchQueue.main.async { if error != nil { print("error=\(error)") return } do{ let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [Ssortingng:AnyObject] print (json) if let arr = json?["counsortinges"] as? [[Ssortingng:Ssortingng]] { self.countryId = arr.flatMap { $0["id"]!} self.counsortinges = arr.flatMap { $0["name"]!} self.teamsTableView.reloadData() print ("Counsortinges: ",self.counsortinges) } if let arr = json?["divisions"] as? [[Ssortingng:Ssortingng?]] { self.divisions = arr.flatMap { ($0["name"]! )} self.divisionId = arr.flatMap { ($0["id"]! )} self.teamsTableView.reloadData() print ("Divisions: ",self.divisions) } } catch{ print(error) } } } 

Cependant, j'ai appris depuis "que le mappage de plusieurs arrays en tant que sources de données en conjonction avec flatMap est assez sujet aux erreurs", et que je devrais utiliser une structure personnalisée à la place.

Comment / Où puis-je commencer à écrire une structure personnalisée pour affecter le contenu de ce tableau JSON dans des variables séparées?

Merci

METTRE À JOUR:

J'ai utilisé le code comme suggéré ci-dessous et je crois que c'est dans le bon sens. Voici la sortie actuelle.

Pays: [KeepScore.SumbitScoreViewController.Country (name: Facultatif ("Denmark"), countryId: Facultatif ("1")), KeepScore.SumbitScoreViewController.Country (name: Facultatif ("Belgium"), countryId: Facultatif ("2" )), KeepScore.SumbitScoreViewController.Country (nom: facultatif ("Brasil"), countryId: Facultatif ("3")),

Cependant, par son apparence, c'est aussi mettre le countryId dans la variable et je voudrais juste le nom pour que je puisse l'appeler dans un UITable … Quelles sont les prochaines étapes pour ce faire?

Même idée que vous, sauf qu'au lieu de cartographier chaque propriété individuelle, vous cartographiez le pays entier.

 //define a struct struct Country { var name: Ssortingng? var countryId: Ssortingng? init(_ dictionary: [Ssortingng : Ssortingng]) { self.name = dictionary["name"] self.countryId = dictionary["id"] } } //defined in your class var counsortinges = [Country]() //when parsing your JSON let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [Ssortingng:AnyObject] print (json) if let arr = json?["counsortinges"] as? [[Ssortingng : Ssortingng]] { self.counsortinges = arr.flatMap { Country($0) } print ("Counsortinges: ",self.counsortinges) } 

Applique la même idée aux divisions.

Modifier:

Dans le code que vous avez posté, vous extrayez à la fois le nom et l'identifiant, c'est pourquoi j'ai inclus les deux dans la structure. Vous pouvez donc supprimer l'identifiant de la structure si vous le souhaitez, ou append d'autres variables dans le futur. Ensuite, lorsque vous voulez les extraire et les utiliser dans votre vue de table, vous n'avez qu'à:

 let country = counsortinges[indexPath.row] cell.textLabel.text = country.name