Как сохранить класс модели в UserDefaults со статическим собственным экземпляром?

У меня есть класс модели User, который я хочу сохранить в UserDefaults

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")
    }

}

Код для сохранения и получения от 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
    }

Экономия

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") 

Я тоже пробовал это

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

но вылетает из-за static var currentUser:User = User()

как это исправить?


person Varun Naharia    schedule 30.05.2017    source источник
comment
что вы пробовали до сих пор. Вы пробовали NSCoding   -  person Shubham Naik    schedule 30.05.2017
comment
Я пишу код, который использую, но не знаю, что делать с static var currentUser:User = User()   -  person Varun Naharia    schedule 30.05.2017
comment
Попробуйте этот ответ   -  person Shubham Naik    schedule 30.05.2017
comment
Или вот этот   -  person Shubham Naik    schedule 30.05.2017
comment
Как видите, я уже пробовал эти   -  person Varun Naharia    schedule 30.05.2017
comment
возможное исправление: stackoverflow.com/a/44940571/4447772   -  person aashish tamsya    schedule 06.07.2017


Ответы (2)


Что касается NSCoding: у вас неправильная подпись метода. Изменять

func encodeWithCoder(aCoder: NSCoder)

to

func encode(with aCoder: NSCoder)

Кроме того, ваш объект должен явно соответствовать протоколу NSCoding:

class User: NSObject, NSCoding {...}

Что касается UserDefaults, вы не можете хранить настраиваемые объекты в UserDefaults, только NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary (или аналогичные типы в Swift), см. документация

person Anton Belousov    schedule 30.05.2017

Вы пробовали заменить эту строку,

static var currentUser:User = User()

с этой строкой,

static var currentUser:User!
person Jigar Tarsariya    schedule 30.05.2017