Search code examples
swift4userdefaults

How to save an Array with Objects to UserDefaults


My Object conforms to the new Swift 4 Codeable protocol. How to save an array of these Objects in UserDefaults?

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

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

Error

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object


Solution

  • Whew, I got it working:

    Here is the Swift 4 Syntax to save an Array with Codeable Objects:

    My solution is to encode it as a JSON Object and save that:

    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")
          }
     }