2017-09-14 1 views
-1

J'ai effectué un appel API pour consigner mes utilisateurs dans une application. J'utilise Alamofire et SwiftyJSON. appel API fonctionne bien et je reçois un fichier JSON comme celui-ci:Impossible de créer un objet avec la réponse JSON à partir de l'appel API

{ 
    "code": 200, 
    "message": "OK", 
    "data": { 
     "user_id": 1, 
     "user_email": "test", 
     "user_username": "kk1", 
    } 
} 

Pour enregistrer les informations utilisateur dans UserDefault, je veux créer mon objet utilisateur avec cette réponse JSON. Voici le modèle

class LFUser: NSObject { 

    var user_id: Int? 
    var user_email: String? 
    var user_username: String? 

    init(dict: [String: AnyObject]){ 
     super.init() 
     user_id = dict["user_id"] as? Int 
     user_email = dict["user_email"] as? String 
     user_username = dict["user_username"] as? String 
    } 
} 

Voici la partie de la fonction de connexion lorsque l'appel API et le objectis créé:

func login(userEmail: String, userPassword: String, finished: @escaping(_ status:String,_ data: LFUser?)->()) { 

      if let value = response.result.value { 

      let dict = JSON(value) 
      let code = dict["code"].intValue 
      let message = dict["message"].stringValue 



      if let data = dict["data"].dictionary { 

       print(data) 
       let user = LFUser(dict: data as [String : AnyObject]) 
       print(user.user_email) 
       finished("Success", user) 

     } 
    } 

L'impression (données) fonctionne bien, mais il y a un problème lors de la création objet et l'impression (user.user_email) afficher nil.

+0

faire quelque chose comme ce lien https://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults –

+0

ty pour cela, mais peut-être cela ne résoudra pas mon problème car je ne peux pas créer correctement l'objet correctement? –

+0

peut-être que c'est la prochaine étape –

Répondre

0

S'il vous plaît vérifier:

if let data = dict["data"].dictionary { 
    let user = LFUser(dict: data) 
    print(user.user_email) 
    finished("Success", user) 
} 


class LFUser: NSObject { 

    var user_id: Int? 
    var user_email: String? 
    var user_username: String? 

    init(dict: [String : SwiftyJSON.JSON]){ 
     super.init() 
     user_id = dict["user_id"]?.intValue 
     user_email = dict["user_email"]?.stringValue 
     user_username = dict["user_username"]?.stringValue 
    } 
} 
+0

Vous avez raison à cause du [String: Any] dans le modèle. Ty –

0

Je pencherais pour Swift 4 de Codable à la place:

struct User: Codable { 
    let user_id: Int 
    let user_email: String 
    let user_username: String 
} 

struct Response: Codable { 
    let code: Int 
    let message: String 
    let data: User 
} 

Ensuite, vous pouvez décoder les données entrantes comme:

let response = try JSONDecoder().decode(Response.self, from: jsonData) 

Ensuite, afin de sauver la valeur par défaut de l'utilisateur, vous peut utiliser JSONEncoder ou PropertyListEncoder pour coder la valeur à Data.

+0

Intéressant, je vais vérifier cela bientôt. Merci beaucoup. –