2017-05-30 2 views
0

J'ai une classe de modèle User que je veux sauver dans UserDefaultsComment enregistrer une classe de modèle dans UserDefaults avec une instance autonome statique?

import UIKit 

class User: NSObject { 

    var name:String! 
    var email:String! 
    var userId:String! 
    var phone:String! 
    var admin_status:String! 
    var social_code:String! 
    var token:String! 
    var otp:String! 
    var forget_otp:String! 
    var p_img:String! 
    var created:String! 
    var status:String! 

    static var currentUser:User = User() 

    override init() { 
     super.init() 
    } 

    required init(coder aDecoder: NSCoder) { 
     self.name = aDecoder.decodeObject(forKey: "name") as! String 
     self.email = aDecoder.decodeObject(forKey: "email") as! String 
     self.userId = aDecoder.decodeObject(forKey: "userId") as! String 
     self.phone = aDecoder.decodeObject(forKey: "phone") as! String 
     self.admin_status = aDecoder.decodeObject(forKey: "admin_status") as! String 
     self.social_code = aDecoder.decodeObject(forKey: "social_code") as! String 
     self.token = aDecoder.decodeObject(forKey: "token") as! String 
     self.otp = aDecoder.decodeObject(forKey: "otp") as! String 
     self.forget_otp = aDecoder.decodeObject(forKey: "forget_otp") as! String 
     self.p_img = aDecoder.decodeObject(forKey: "p_img") as! String 
     self.created = aDecoder.decodeObject(forKey: "created") as! String 
     self.status = aDecoder.decodeObject(forKey: "status") as! String 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encode(name, forKey: "name") 
     aCoder.encode(email, forKey: "email") 
     aCoder.encode(userId, forKey: "userId") 
     aCoder.encode(phone, forKey: "phone") 
     aCoder.encode(admin_status, forKey: "admin_status") 
     aCoder.encode(social_code, forKey: "social_code") 
     aCoder.encode(token, forKey: "token") 
     aCoder.encode(otp, forKey: "otp") 
     aCoder.encode(forget_otp, forKey: "forget_otp") 
     aCoder.encode(p_img, forKey: "p_img") 
     aCoder.encode(created, forKey: "created") 
     aCoder.encode(status, forKey: "status") 
    } 

} 

code pour enregistrer et obtenir de UserDefaults

class func setUserDefault(ObjectToSave : AnyObject? , KeyToSave : String) 
    { 
     let defaults = UserDefaults.standard 

     if (ObjectToSave != nil) 
     { 

      defaults.set(ObjectToSave, forKey: KeyToSave) 
     } 

     UserDefaults.standard.synchronize() 
    } 

    class func getUserDefault(KeyToReturnValye : String) -> AnyObject? 
    { 
     let defaults = UserDefaults.standard 

     if let name = defaults.value(forKey: KeyToReturnValye) 
     { 
      return name as AnyObject 
     } 
     return nil 
    } 

Enregistrement

let user:User = User() 
        user.name = json["data"]["first_name"].string 
        user.email = json["data"]["email"].string 
        user.phone = json["data"]["phone"].string 
        user.social_code = json["data"]["social_code"].string 
        user.admin_status = json["data"]["admin_status"].string 
        user.otp = json["data"]["otp"].string 
        user.forget_otp = json["data"]["forget_otp"].string 
        user.p_img = json["data"]["p_img"].string 
        user.status = json["data"]["status"].string 
        user.userId = json["data"]["id"].string 
        user.created = json["data"]["created"].string 

        Utilities.setUserDefault(ObjectToSave: user, KeyToSave: "user") 

J'ai aussi essayé cette

let encodedData = NSKeyedArchiver.archivedData(withRootObject: user) 
        UserDefaults.standard.set(encodedData, forKey: "User") 

mais il se bloque à cause de static var currentUser:User = User()

comment résoudre ce problème?

+0

Qu'avez-vous essayé jusqu'à maintenant. Avez-vous essayé NSCoding –

+0

J'écris le code que j'utilise mais je ne sais pas quoi faire avec 'static var currentUser: User = User()' –

+0

Essayez [cette réponse] (https://stackoverflow.com/questions/43271947/comment-peut-stocker-custom-objets-in-nsuserdefaults) –

Répondre

2

En ce qui concerne NSCoding: vous avez une signature erronée de la méthode. Changer

func encodeWithCoder(aCoder: NSCoder) 

à

func encode(with aCoder: NSCoder) 

En outre, votre objet doit être conforme explicitement au protocole NSCoding:

class User: NSObject, NSCoding {...} 

Quant à UserDefaults, vous ne pouvez pas stocker des objets personnalisés dans les UserDefaults, seulement NSData, NSString, NSNumber, NSDate, NSArray, ou NSDictionary (ou types similaires dans Swift), voir documentation

0

Avez-vous essayé en remplaçant votre cette ligne,

static var currentUser:User = User() 

avec cette ligne,

static var currentUser:User!