How to Save Array of object in UserDefaults in iOS 12.0. using Any Array [[String: Any]]

Viewed 274

I want to save an array of object in user default without using Codable.

I tried it to convert an array in data and save in User default:

 let childsArray = result["childs"] as? [[String: Any]]
 let childsData = NSKeyedArchiver.archivedData(withRootObject: childsArray!)
 UserDefaults.standard.set(childsData, forKey: "childsArray")
 UserDefaults.standard.synchronize()

It gives me this warning:

'archivedData(withRootObject:)' was deprecated in iOS 12.0: Use +archivedDataWithRootObject:requiringSecureCoding:error: instead

How do I resolve this warning and achieve my desired goal of saving an array of objects in UserDefaults?

2 Answers
let object1 = ["key1":"value1"]
let object2 = ["key2":"value2"]
let array = [object1, object2]
UserDefaults.standard.set(array, forKey: "childArray")
UserDefaults.standard.synchronize()

let storedArray = UserDefaults.standard.value(forKey: "childArray") as! [[String:String]]
print(storedArray)

You can archived array using code below:

do {
    let childsData = try NSKeyedArchiver.archivedData(withRootObject: childsArray!, requiringSecureCoding: true)
    UserDefaults.standard.set(childsData, forKey: "childsArray")
    UserDefaults.standard.synchronize()
} catch {
    print(error)
}

And unarchive objects using code below:

do {
    let childData = UserDefaults.standard.value(forKey: "childsArray")
    if let childArray = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(childData as! Data) {
        print(childArray)
    }
} catch {
    print(error)
}
Related