尝试在Swift 3中保存自定义对象时尝试插入非属性列表对象
我有一个符合NSCoding
协议的简单对象。
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") } }
我试图在UserDefaults
保存它的一个实例,但它保持失败,出现以下错误。
由于未捕获的exception“NSInvalidArgumentException”而终止应用程序,原因:“试图为关键jobCategory插入非属性列表对象”
这是我保存在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() } }
我用一个普通的stringreplace枚举值为键,但仍然发生相同的错误。 任何想法是什么造成这个?
您需要使用NSKeyedArchiver.archivedData(withRootObject:)
从JobCategory
实例创buildData
实例,并将该Data
实例存储在UserDefaults
,然后使用NSKeyedUnarchiver.unarchiveObject(with:)
取消存档,所以试试这样。
用于在UserDefaults
存储数据
let category = JobCategory(id: 1, name: "Test Category", URLString: "http://www.example-job.com") let encodedData = NSKeyedArchiver.archivedData(withRootObject: category) let userDefaults = UserDefaults.standard userDefaults.set(encodedData, forKey: UserDefaultsKeys.jobCategory.rawValue)
用于从UserDefaults
检索数据
let decoded = UserDefaults.standard.object(forKey: UserDefaultsKeys.jobCategory.rawValue) as! Data let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! JobCategory print(decodedTeams.name)