sunshinejr / SwiftyUserDefaults

Modern Swift API for NSUserDefaults
http://radex.io/swift/nsuserdefaults/static
MIT License
4.85k stars 366 forks source link

How to store an object in NSUserDefault? #161

Closed reza-khalafi closed 5 years ago

reza-khalafi commented 6 years ago

How to save an NSObject or Struct to NSUserDefault?

sunshinejr commented 6 years ago

Hey @reza-khalafi, what you mean by "NSObject or Struct"? If you have a subclass, please take a look at the Readme.md, as there are multiple ways for Codable, RawRepresentable, NSCoding or custom types.

Also, currently we have a problem with non-final classes, tracked #157.

reza-khalafi commented 6 years ago

Recently, I using code like this:

import UIKit

class User: NSObject,NSCoding {
    var ID:Int!
    var name:String!
    var email:String!
    init(
        ID:Int,
        name:String,
        email:String
        ) {
        self.ID = ID
        self.name = name
        self.email = email
    }
    //DECODE
    required convenience init?(coder decoder: NSCoder) {
        guard let ID = decoder.decodeObject(forKey: "ID") as? Int else { return nil }
        guard let name = decoder.decodeObject(forKey: "name") as? String else { return nil }
        guard let email = decoder.decodeObject(forKey: "email") as? String else { return nil }
        self.init(
            ID:ID,
            name:name,
            email:email
        )
    }
    //ENCODE
    func encode(with aCoder: NSCoder) {
        aCoder.encode(ID,forKey: "ID")
        aCoder.encode(name,forKey: "name")
        aCoder.encode(email,forKey: "email")
    }
}//class

And Set and Get like this:

func getUserObjectFromUserDefault() -> User? {
        let def = UserDefaults.standard.object(forKey:"MyUserObject")
        if def == nil {
            return nil
        }else{
            if NSKeyedUnarchiver.unarchiveObject(with: def  as! Data) as? User  != nil {
                return NSKeyedUnarchiver.unarchiveObject(with: def  as! Data) as? User
            }else{
                return nil
            }
        }
    }

    func setUserObjectInUserDefault(userObj:User) {
        UserDefaults.standard.setValue(NSKeyedArchiver.archivedData(withRootObject: userObj), forKey: "MyUserObject")

    }

Is there easier way for save my custom object in NSUserDefault?