2017-07-12 3 views
1

Mon objet est conforme au nouveau protocole Swift 4 Codeable. Comment enregistrer un tableau de ces objets dans UserDefaults?Comment enregistrer un tableau avec des objets dans UserDefaults

struct MyObject: Codeable { 
    var name: String 
    var something: [String] 
} 

myObjectsArray = [MyObject]() // filled with objects 
UserDefaults.standard.set(myObjectsArray, forKey: "user_filters") 

Erreur

Mettre fin application en raison d'une exception non interceptée 'NSInvalidArgumentException', motif: « Tentative d'insérer non-propriété objet liste

Répondre

2

Ouf, je l'ai travail: Voici le Swift 4 Sy ntax pour enregistrer un Array avec Codeable Objets:

Ma solution est de coder comme un objet JSON et enregistrer que:

static var getAllObjects: [MyObject] { 
     let defaultObject = MyObject(name: "My Object Name") 
     if let objects = UserDefaults.standard.value(forKey: "user_objects") as? Data { 
     let decoder = JSONDecoder() 
     if let objectsDecoded = try? decoder.decode(Array.self, from: objects) as [MyObject] { 
      return objectsDecoded 
     } else { 
      return [defaultObject] 
     } 
     } else { 
     return [defaultObject] 
     } 
    } 

static func saveAllObjects(allObjects: [MyObject]) { 
     let encoder = JSONEncoder() 
     if let encoded = try? encoder.encode(allObjects){ 
     UserDefaults.standard.set(encoded, forKey: "user_objects") 
     } 
} 
+0

C'est une solution agréable - j'utilisais encodeur liste de propriétés. Marquez-vous correct! –