Swift 3 d'économie et de récupération de l'objet personnalisé de userDefaults

J'ai cela en Aire de jeu à l'aide de Swift 3, Xcode 8.0:

import Foundation
class Person: NSObject, NSCoding {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    required convenience init(coder aDecoder: NSCoder) {
        let name = aDecoder.decodeObject(forKey: "name") as! String
        let age = aDecoder.decodeObject(forKey: "age") as! Int
        self.init(
            name: name,
            age: age
        )
    }
    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(age, forKey: "age")
    }
}

créer la matrice de la Personne

let newPerson = Person(name: "Joe", age: 10)
var people = [Person]()
people.append(newPerson)

encoder le tableau

let encodedData = NSKeyedArchiver.archivedData(withRootObject: people)
print("encodedData: \(encodedData))")

enregistrer pour userDefaults

let userDefaults: UserDefaults = UserDefaults.standard()
userDefaults.set(encodedData, forKey: "people")
userDefaults.synchronize()

vérifier

print("saved object: \(userDefaults.object(forKey: "people"))")

récupérer à partir de userDefaults

if let data = userDefaults.object(forKey: "people") {
    let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: data as! Data)
    print("myPeopleList: \(myPeopleList)")
}else{
    print("There is an issue")
}

il suffit de consulter les données archivées

if let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: encodedData){
   print("myPeopleList: \(myPeopleList)")
}else{
   print("There is an issue")
}

Je ne suis pas en mesure d'enregistrer correctement les données de l'objet à userDefaults, et en plus, la case en bas crée l'erreur "fatal error: de façon inattendue trouvé nulle, tandis que d'ôter une valeur Facultative". Le "check" de la ligne de montre également enregistrées objet est nul. Est-ce une erreur dans mon objet NSCoder?

  • if let data = userDefaults.data(forKey: "people"), let myPeopleList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Person] {
  • J'ai mis cela dans une seule page de test de l'app et même résultat, avec votre suggestion de changement. Il ressemble, il peut être un problème avec l'objet du codeur. L'erreur que j'obtiens est: erreur fatale: de façon inattendue trouvé nulle, tandis que d'ôter une valeur Facultative et son à la ligne "si nous permettre de données = userDefaults.de données(forKey: "les gens") { laisser myPeopleList = NSKeyedUnarchiver.unarchiveObject(avec données )"
InformationsquelleAutor user773881 | 2016-06-23