Stocker des données (Array/JSON) ?
Bonjour à tous,
je suis développeur débutant sous XCode/Swift3.
Je réalise un application simple pour iOS dans laquelle je souhaite collecter des données de la part de l'utilisateur au travers de plusieurs écrans, comme un wizard (Navigation controller ok).
La question que je me pose est : comment stocker les choix de l'utilisateur ?
J'aimerais partir sur un Array, mais je galère pour stock ceci :
Ecran 1 :
- Choix A
Ecran 2 :
- Choix B
- --- Valeur 1
Ecran 3 :
- Choix B
- et Choix D
- --- Valeur 1
- --- Valeur "Toto"
En fonction des réponses, j'imaginais créer un tableau de tableau multi-type pouvant accueillir des String, des Int, des Dates, etc...
Enfin, je souhaitais sérialiser ce tableau dans une chaà®ne JSon pour l'envoyer vers un serveur avec une requête http (API REST).
Je suis parti sur une classe toute simple :
class appDataProfs: NSObject {
var data : [String : AnyObject]
// Constructeur
override init() {
self.data = ["":AnyObject.self as AnyObject]
super.init()
}
}
Ensuite, j'ai fais le gros dégelasse pour mes tests et je déclare ceci dans mon AppDelegate :
var globalAppDataProfs = appDataProfs() // On que c'est pas beau !!!!
Et je l'alimente dans une méthode de ViewController comme ça :
globalAppDataProfs.data["Eleve"] = "Margot" as AnyObject
globalAppDataProfs.data["Coucou"] = "Zoulou" as AnyObject
globalAppDataProfs.data["SousDonnées"] = ["sd1", "sd2"] as AnyObject
Bref, je lutte pas mal et vos conseils seront les bienvenus. Merci d'avance.
Réponses
Swift 3 ? Met à jour Xcode et passe à Swift 4, dont l'un des avantages est de gérer le Json nativement.
Un tuto sur la question : http://benscheirman.com/2017/06/ultimate-guide-to-json-parsing-with-swift-4/
- stocker en vrac dans un dictionnaire
- stocker dans des objets.
Généralement, on partira plutôt sur la seconde:
Et pour utiliser:
Remarque que les champs sont identifiés par des propriétés, et on ne peut donc pas se tromper sur les clefs, contrairement à un dictionnaire.
Cette conversion se fait généralement à l'aide de (NS)JSONSerialization, qui renvoie une (NS)Data en sérialisant des objets Foundation " c'est à dire des dictionnaires et arrays.
Il faut donc que chaque objet renvoie un dictionnaire. On peut donc écrire ceci:
Et pour convertir en JSON:
Merci pour ta réponse.
Je suis en dernière version d'XCode 9.0.1 donc Swift4 j'imagine. Je ne sais pas comment vérifier.
Merci beaucoup pour tes réponses rapides et complète, je vais étudier cela de prés.
Cependant, passer par un objet me paraà®t très complexe, surtout quand, au final, mon "arbre" de données doit être celui-ci :
Pour 1 Elève [Alpha Prénom] et 1 date [Date] de prochain cours, j'ai à stocker :
· Programme n°1 : [Alpha ou IdProgramme]
o Evaluation (une seule)
§ Une note de [1 à 3]
§ Un Commentaire [Alpha 400]
o Objectif n°1 (est composé de) :
§ Parties : [choix multiple parmi A à Z] ou [mesure x]
· Actions : [choix multiple parmi] :
o Mens.
o MSep.
o Par coe“ur
o X
o Y
o Z
o Etc...
· Métronome :
o Tempo : [Int]
o Rythme de référence [Noire ou Croche]
· Nombre de répétitions : [Int]
Méthode de travail
· Temps de travail [Int] en minutes
· Points d'attentions : (est composé de)
o Texte [Choix multiple parmi] :
§ Doigté
§ Concentration
§ Lecture
§ Etc...
o Corps [Choix multiple parmi] :
§ Epaules
§ Dos
§ Bras
§ Doigts
o Interprétation :
§ Commentaire [Alpha]
§ Objectif n°2 (est composé de) :
· ...
· Programme n°2 : [Alpha ou IdProgramme]
o ...
Tu parles de ce genre de fonctions ?
ça me paraà®t digeste...
https://www.raywenderlich.com/172145/encoding-decoding-and-serialization-in-swift-4
Merci
Dans ton cas, il est probable que tu auras de toute façon un JSON en entrée pour définir le questionnaire, et tu réutiliseras les clefs pour stocker les résultats.
Oui tu as tout à fait raison.
Je vais donc tout decrire en objets, propriétés simples et énumérations, maisn pour un gars qui vient du PHP sans fois ni loi ça fait bizarre 😂😂😂
Merci encore pour votre aide.
Oui, c'est bien du Swift 4.
Swift 3 c'était Xcode 8.
Je ne vais pas relancer le débat sur le typage statique vs. le typage dynamique, mais tu verras qu'un compilateur qui prévient des erreurs lors de la frappe, c'est bien mieux que de lancer l'application, s'apercevoir qu'elle ne fonctionne pas, puis faire la chasse au bug.
Alors là les mecs, je viens appuyer sur ce point.
C'est un conseil que m'avait donné Ali à l'époque sans trop insister et je ne l'avais pas écouté. Toute mon appli repose sur des tableaux de dictionnaires.
Ca marche bien, pas de soucis mais en maintenance, c'est juste une horreur. Te remettre dans le code 2, 3, 4 ans après, c'est vraiment pas facile. En outre, je passe petit à petit l'appli en swift et manipuler des NSDicionary, c'est chiant.
Au final, j'ai fini par créer des objets et je suis en pleine session de modif de code pour utiliser les objets au lieu des dictionnaires et je constate qu'effectivement, tout est plus simple, tout est plus clair.
Le compilo complète, swift est moins chiant, le code est plus clair, je peux manipuler directement dans CoreData. Bref, si c'est pas le bonheur, ça y ressemble
Donc Machaon, ne te pose pas la question. Fais des objets
Ok Messieurs, merci pour vos conseils, j'ai tout fait en objet, de toutes façons avec des dictionnaires c'était l'enfer.
Par contre, ça me fait une structure monstrueuse.
Ensuite le passage en JSON, ça prend 3 lignes, c'est super.
(comme en PHP en fait avec un ArrayToJson 8--) ).
PS : Il me tarde de coder l'API côté serveur... en PHP
J'ai pas encore tous les reflexes avec ce full objet surtout avec des données riches comme ci-dessous :