Cours Alamofire et Valeurs Nuls

#Salutation

Je suis actuellement en stage et j’ai proposé l’idée de créer une application de Consultation de Clients IOS en relation avec une base de données distantes, j’ai donc créer un petit script PHP pour récupérer du JSON, il fonctionne nickel. Le problème est que avec la cours je n’ai pas vu comment gérer l’eventualité qu’un champ (du JSON) soit null donc tous mes clients qui n’ont pas une valeur ne sont pas afficher dans ma TableView.

 Alamofire.request("http://localhost/fonctionPhp/testJSON.php").validate().responseJSON { response in
        print(response.result)
        if response.result.isSuccess {
            if let listTelecharge:[[String:Any]] = response.result.value as? [[String:Any]] {
                for user:[String:Any] in listTelecharge {
                    if let civilite = user["civilite"] as? String, let libelleClient = user["libelleClient"] as? String, let mail = user["email"] as? String, let fixe = user["fixe"] as? String, let mobile = user["mobile"] as? String {
                    self._personList.append(Person(civilite: civilite, libelleClient: libelleClient, mail: mail, fixe: fixe, mobile: mobile))
                    }
                }
                
                self.tableView.reloadData()
            }
        }

Voila un exemple du JSON que je récupère, celui ci ne fonctionne pas,

JSON: ( { civilite = "M. et Mme"; commentaire = "<null>"; email = "<null>"; facturation = "Pour confirmation de votre commande, merci de nous"; fax = "<null>"; fixe = "06 13 13 13 13"; libelleClient = Test; mobile = "<null>"; remiseGenerale = 0; siret = "<null>"; },

Celui ci fonctionne

{
    civilite = "M.";
    commentaire = "<null>";
    email = "[email protected]";
    facturation = "Pour confirmation de votre commande, merci de nous";
    fax = "<null>";
    fixe = "02 40 40 40 40";
    libelleClient = Cadets;
    mobile = "06 10 10 10 10";
    remiseGenerale = 0;
    siret = "<null>";
},

Salut,

Et le premier fonctionne si la vérification sur l’email et le mobile est supprimée du code ?

La question est justement la comment supprimer la vérification, car la base de donnée n’a pas été rempli rigoureusement à la base, du coup plusieurs champs sont null et le but est que même si la valeur du JSON est null la fiche client s’affiche quand même

Le format de ton json est invalide, pour une valeur nulle, il ne faut pas de guillements ni de chevrons. De plus les séparateurs sont des virugles et non des points virgules. Et la dernière valeur ne doit pas avoir de virgule.

Il te faudrait ceci par exemple :

{
    civilite = "M.",
    commentaire = null,
    email = "[email protected]",
    facturation = "Pour confirmation de votre commande, merci de nous",
    fax = "<null>",
    fixe = "02 40 40 40 40",
    libelleClient = Cadets,
    mobile = "06 10 10 10 10",
    remiseGenerale = 0,
    siret = null

}
Une fois que ton JSON est valide tu peux tester correctement tes valeurs (il est possible que ça marche aussi avec un JSON invalide mais tu risques d’avoir des problèmes dans certains cas).
Dans ton test tu fais un if let géant dans lequel tu vérifie que certaines valeurs sont bien présentes avant d’ajouter la personne. Dans ton cas il manque l’email et le numéro de mobile donc ton if let ne passe pas.
Il te faut tester chaque valeur et si elle est vide mettre une valeur par defaut pour les valeurs qui pourraient être manquantes. Ou alors faire en sorte que ton constructeur de Personne accepte les optionnels et dans ce cas tu ne fait pas de if let et tu envoies tout dans ton objet Personne.
Tu as aussi un opérateur de valeur par défaut en swift que nous n’avons pas abordé en cours : ??
let mail = user["email"] as? String ?? ""
ou
let mail = user["email"] as? String ?? "email inconnu"

Ok nickel merci beaucoup Maxime je fais faire tout ça cet après midi :slight_smile:

Au final j’ai vérifier dans le constructeur mais je sais pas si c’est super propre parceque l’opérateur de valeur par défaut je n’arrivait pas à le faire fonctionner …

if prenom != nil {
       self.prenom = prenom!
    } else{
        self.prenom = "Prenom Inconnue"
    }

Hello, j’ai le même soucis je pense, mais je ne parvient pas à le résoudre :

 Alamofire.request("https://www.xxxxxxxxxxxx.fr/~swift/service.php").validate().responseJSON { (response:DataResponse<Any>) in
            if response.result.isSuccess {
                if let userList:[[String:Any]] = response.result.value as? [[String:Any]] {
                    for user:[String:Any] in userList {
                        if let userid = user["id"] as? String,
                            let nick = user["display"] as? String,
                            let email = user["email"] as? String,
                            let firstname = user["firstname"] as? String ?? "",
                            let lastname = user["lastname"] as? String ?? "",
                            let fbid = user["fbid"] as? String ?? "" {
                                self._personList.append(Nickserv(id: userid, nick: nick, email: email, firstname: firstname, lastname: lastname, fbid: fbid))
                        }
                    }
                    self.tableView.reloadData()
                }
            }
        }

L’erreur que j’obtiens sur les lignes let firstname, let lastname et let fbid:
Initializer for conditional binding must have Optional type, not 'String'

Le Json est valide dans mon cas. Tous les users n’ont pas forcément de firstname, lastname et fbid. Voici ma class :
class Nickserv {
var id:String
var nick:String
var email:String
var firstname:String
var lastname:String
var fbid:String

    init(id:String, nick:String, email:String, firstname:String?, lastname:String?, fbid:String?) {
        self.id = id
        self.nick = nick
        self.email = email
        self.firstname = firstname!
        self.lastname = lastname!
        self.fbid = fbid!
    }
}

là je patauge! :confused:

Bon bah, j’ai lu un peu mieux l’erreur et en faite, il fallait un ? après la déclaration du type (as? String**?** ?? “”), si ça peut aider quelqu’un :

...
let firstname = user["firstname"] as? String? ?? "",
let lastname = user["lastname"] as? String? ?? "",
let fbid = user["fbid"] as? String? ?? "" {
...