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);
}
}
3 Réponses :
en mots simples: strong> ! code> déballer avec force la valeur qui signifie en ajoutant in Swift 4, Vous n'êtes pas obligé d'appliquer ? code> est un paramètre facultatif, qui empêche votre code de se bloquer si votre valeur est nulle. p> ! 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> [ [; 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)
}
}
Je vous recommanderais de vérifier et de mettre en œuvre alamofire , Promesskit et SWIFTYJSON A > Ces 3 bibliothèques Swift rendront votre vie super facile, car vous pouvez faire des promesses, des demandes HTTP, puis analyser votre JSON dans moins de lignes de code, il a une lisibilité plus facile et vous fera gagner beaucoup de temps, voici un exemple, en utilisant votre Code comme référence: import AlamoFire
import SwiftyJson
import PromiseKit
func DownloadDataAndParseJSON() {
let headers = ["headerParameter": parameter]
let dictionary = [String:String]
Alamofire.request(url, method: .get, headers: headers).responseJSON { response in
let json = JSON(response.result.value as Any)
if let items = json.array {
for item in items{
let name = item["tenant"].string ?? " "
let geolocation = item["geolocation"].string ?? " "
dictionary.updateValue(geolocation, forKey: name)
}
}
}
}
OK, merci aux commentaires que j'ai découverts comment à cela, en utilisant Je me luttais avec ses types aussi bien que de décoder à un objet code> code> 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 p> qui n'a que la variable de données qui correspond alors au compte p > avec cela, le poteau devient vraiment simple p> merci !! p> p> p> jsonsérialization code> é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
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 code>.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 code> pourrait être ce dont j'ai besoin, mais ma réponse a une pagination, et je veux obtenir le champdata code> danscompte < / code> s tableau, quelque chose de facile comme cecomptes = réponse.data ["DATA"]. Carte (... Compte de retour (...)) Code> 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); }} `` ``