尝试在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)