Attempt to insert non-property list object when trying to save a custom object in Swift 3 Attempt to insert non-property list object when trying to save a custom object in Swift 3 ios ios

Attempt to insert non-property list object when trying to save a custom object in Swift 3


You need to create Data instance from your JobCategory instance using archivedData(withRootObject:) and store that Data instance in UserDefaults and later unarchive using unarchiveTopLevelObjectWithData(_:), So try like this.

For Storing data in UserDefaults

let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com")let encodedData = NSKeyedArchiver.archivedData(withRootObject: category, requiringSecureCoding: false)let userDefaults = UserDefaults.standarduserDefaults.set(encodedData, forKey: UserDefaultsKeys.jobCategory.rawValue)

For retrieving data from UserDefaults

let decoded  = UserDefaults.standard.object(forKey: UserDefaultsKeys.jobCategory.rawValue) as! Datalet decodedTeams = NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decoded) as! JobCategoryprint(decodedTeams.name)


Update Swift 4, Xcode 10

I have written a struct around it for easy access.

//set, get & remove User own profile in cachestruct UserProfileCache {    static let key = "userProfileCache"    static func save(_ value: Profile!) {         UserDefaults.standard.set(try? PropertyListEncoder().encode(value), forKey: key)    }    static func get() -> Profile! {        var userData: Profile!        if let data = UserDefaults.standard.value(forKey: key) as? Data {            userData = try? PropertyListDecoder().decode(Profile.self, from: data)            return userData!        } else {            return userData        }    }    static func remove() {        UserDefaults.standard.removeObject(forKey: key)    }}

Profile is a Json encoded object.

struct Profile: Codable {let id: Int!let firstName: Stringlet dob: String!}

Usage:

//save details in user defaults...UserProfileCache.save(profileDetails)

Hope that helps!!!

Thanks


Save dictionary Into userdefault

let data = NSKeyedArchiver.archivedData(withRootObject: DictionaryData)UserDefaults.standard.set(data, forKey: kUserData)

Retrieving the dictionary

let outData = UserDefaults.standard.data(forKey: kUserData)let dict = NSKeyedUnarchiver.unarchiveObject(with: outData!) as! NSDictionary