I have a simple object which conforms to the NSCoding protocol.
import Foundation
class JobCategory: NSObject, NSCoding {
    var id: Int
    var name: String
    var URLString: String
    init(id: Int, name: String, URLString: String) {
        self.id = id
        self.name = name
        self.URLString = URLString
    }
    // MARK: - NSCoding
    required init(coder aDecoder: NSCoder) {
        id = aDecoder.decodeObject(forKey: "id") as? Int ?? aDecoder.decodeInteger(forKey: "id")
        name = aDecoder.decodeObject(forKey: "name") as! String
        URLString = aDecoder.decodeObject(forKey: "URLString") as! String
    }
    func encode(with aCoder: NSCoder) {
        aCoder.encode(id, forKey: "id")
        aCoder.encode(name, forKey: "name")
        aCoder.encode(URLString, forKey: "URLString")
    }
}
I'm trying to save an instance of it in UserDefaults but it keeps failing with the following error.
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object for key jobCategory'
This is the code where I'm saving in UserDefaults.
enum UserDefaultsKeys: String {
    case jobCategory
}
class ViewController: UIViewController {
    @IBAction func didTapSaveButton(_ sender: UIButton) {
        let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com")
        let userDefaults = UserDefaults.standard
        userDefaults.set(category, forKey: UserDefaultsKeys.jobCategory.rawValue)
        userDefaults.synchronize()
    }
}
I replaced the enum value to key with a normal string but the same error still occurs. Any idea what's causing this?
                        
You need to create
Datainstance from yourJobCategorymodel usingJSONEncoderand store thatDatainstance inUserDefaultsand later decode usingJSONDecoder.Old Answer
You need to create
Datainstance from yourJobCategoryinstance usingarchivedData(withRootObject:)and store thatDatainstance inUserDefaultsand later unarchive usingunarchiveTopLevelObjectWithData(_:), So try like this.For Storing data in
UserDefaultsFor retrieving data from
UserDefaults