2016-12-28 31 views
12

我有一個符合NSCoding協議的簡單對象。嘗試在Swift中保存自定義對象時嘗試插入非屬性列表對象3

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但它一直與以下錯誤而失敗。

終止應用程序由於未捕獲的異常「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() 
    } 
} 

我用普通字符串替換了枚舉值,但仍然出現相同的錯誤。任何想法是什麼造成這個?

回答

35

您需要使用NSKeyedArchiver.archivedData(withRootObject:)JobCategory實例創建Data實例和Data實例存儲在UserDefaults後來解除存檔使用NSKeyedUnarchiver.unarchiveObject(with:),因此,嘗試這樣的。

對於來自UserDefaults

let decoded = UserDefaults.standard.object(forKey: UserDefaultsKeys.jobCategory.rawValue) as! Data 
let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! JobCategory 
print(decodedTeams.name) 
+1

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) 

存儲數據檢索數據是否有從這樣一個大的性能衝擊嗎? –

相關問題