-2
votes

Swift Dictionnaire Types

Je vais fou de swift, Je suis un expert objectif C développeur et j'essaie de faire des choses de base à Swift, mais je deviens fou sur les types et! et?

Dans l'exemple suivant, je fais un simple get où je reçois un Json, et je veux convertir les types de compte JSON ["DATA"] aux types de comptes: P>

mais sur la carte Je reçois toujours des erreurs de compilation dû les types non valides, et lorsque j'ai pu le faire compiler, alors je reçois une exception ... P>

aucune idée sur la façon dont je devrais-je continuer? P>

HTTP.GET(url, parameters: [], headers: headers) { response in
    do {
        let json = try JSONSerialization.jsonObject(with: response.data, options: []) as! [String: Any]
        let accountsDict: NSArray = json["data"] as! NSArray;

        let accounts = accountsDict.map { (dict) -> Account in
            let dict2 = dict as! Dictionary<String, String>
            debugPrint(dict);
            return Account(name       : dict2["tenant"]!,
                           geolocation: dict2["geolocation"]!);
        }
        completion(accounts);
    }catch{
        print(error.localizedDescription)
        completion(nil);
    }

}


6 commentaires

S'il vous plaît montrer votre réponse JSON comme texte. Et si vous voulez vous familiariser avec Swift, vous devriez mieux utiliser nsarray .


N'utilisez pas de jsonsorialisation. Utilisez décodable.


On dirait que vous avez des difficultés avec les options d'option, entre autres choses. Vous devriez prendre un peu de temps pour lire le Guide de la langue rapide, en particulier la section sur Optionals . Cela peut prendre un certain temps pour "cliquer", mais les options sont en fait tout à fait droit, et ils résolvent un problème que vous avez le plus certainement dans le temps, le temps et l'heure à nouveau, en tant que développeur Objc. Les options sont une solution aux motifs 4 de code que j'ai énumérés dans ce Reddit Post < / a>


Pour réitérer le commentaire de Matt, votre douleur vient de jsonsorialisation. C'est très très peu probable que vous souhaitiez utiliser cet outil. Cela crée toutes les maux de tête que vous rencontrez. Vous souhaitez utiliser une structure décodable et JSondecoder, qui sont conçus pour travailler très bien à Swift. La jsonsorialisation n'existe que dans Swift, car elle est pontée de l'OBJC.


Merci pour l'info, on dirait que jsondecoder pourrait être ce dont j'ai besoin, mais ma réponse a une pagination, et je veux obtenir le champ data dans compte < / code> s tableau, quelque chose de facile comme ce comptes = réponse.data ["DATA"]. Carte (... Compte de retour (...)) Et le JSondecode me force à le décoder à Un objet défini mais j'aimerais que l'objet de pagination soit d'abord un dictionnaire générique , mais tout n'est pas décodable ...


OOOKK .. Créer une structure pour la pagination résolue le problème, `` `structure pagination: décodable {var données: tableau ; } ------- http.get (URL, paramètres: [], en-tête: en-têtes) {Réponse dans do {let Jsondecoder = jsondecoder () Laissez Comptes = Essayez jsondecoder.decode (pagination.fr, de: Response.Data ) achèvement (comptes.data); } Catch {Imprimer (Error.LocalisOalisédescription) Achèvement (NIL); }} `` ``


3 Réponses :


0
votes

en mots simples: strong>

? code> est un paramètre facultatif, qui empêche votre code de se bloquer si votre valeur est nulle. p>

! code> déballer avec force la valeur qui signifie en ajoutant ! code> Vous vous assurez que votre variable aura de la valeur et si elle est nil code>, votre code s'écrasera. , alors n'utilisez pas ! code> au cas où si vous n'êtes pas sûr de la valeur. P>

Type: strong> P>

in Swift 4, [: ] CODE> Votre dictionnaire est votre dictionnaire au format de la valeur de clé et [] code> est un tableau. Par exemple: p> xxx pré>

Vous n'êtes pas obligé d'appliquer ; code> à Swift et vous pouvez utiliser la vérification facultative par si-let Code> Pour vérifier si votre variable a une valeur lors de l'analyse de la réponse JSON comme suit: P>

    HTTP.GET(url, parameters: [], headers: headers) { response in
        do {
            let json = try JSONSerialization.jsonObject(with: response.data, options: []) as? [String: Any]
            var accounts = [Account]()
            if let accountsDict = json?["data"] as? [[String: String]] {
                accounts = accountsDict.map { dict -> Account in
                    return Account(name: dict["tenant"]!, geolocation: dict["geolocation"]!)
                }
            }
            completion(accounts)
        } catch {
            print(error.localizedDescription)
            completion(nil)
        }
    }


0 commentaires


0
votes

OK, merci aux commentaires que j'ai découverts comment à cela, en utilisant jsonsérialization était une mauvaise idée de Swift, à l'aise-C lib et Swifts a son propre JSondecode < / code> qui fait tout cela de manière plus simple

Je me luttais avec ses types aussi bien que de décoder à un objet décodable, donc je ne pouvais donc pas utiliser le tableau générique / dictus Nous utiliserions à Obj-C, alors j'ai dû créer une structure pour la réponse xxx

qui n'a que la variable de données qui correspond alors au compte

avec cela, le poteau devient vraiment simple xxx

merci !!


0 commentaires