2016-12-28 18 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() 
    } 
} 

Я заменил значение enum на клавишу с нормальной строкой, но эта же ошибка все еще происходит. Любая идея, что вызывает это?

ответ

35

Вам нужно создать Data экземпляр из вашего JobCategory экземпляра с помощью NSKeyedArchiver.archivedData(withRootObject:) и хранить эту 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) 
+1

Есть большой хит производительности делать это? –