如何在iOS 12.0的UserDefaults中保存对象数组。使用任意数组[[String:Any]]

如何在iOS 12.0的UserDefaults中保存对象数组。使用任意数组[[String:Any]],ios,swift,ios12,Ios,Swift,Ios12,我想在不使用Codable的情况下以用户默认值保存对象数组 我尝试将数组转换为数据并保存为用户默认值: let childsArray = result["childs"] as? [[String: Any]] let childsData = NSKeyedArchiver.archivedData(withRootObject: childsArray!) UserDefaults.standard.set(childsData, forKey: "childsArray") Us

我想在不使用Codable的情况下以用户默认值保存对象数组

我尝试将数组转换为数据并保存为用户默认值:

 let childsArray = result["childs"] as? [[String: Any]]
 let childsData = NSKeyedArchiver.archivedData(withRootObject: childsArray!)
 UserDefaults.standard.set(childsData, forKey: "childsArray")
 UserDefaults.standard.synchronize()
它给了我这样的警告:

中不推荐使用“archivedData(withRootObject:)” iOS 12.0:使用+archivedDataWithRootObject:RequiringSecureCodeding:错误:改为


如何解决此警告并实现在UserDefaults中保存对象数组的预期目标?

您可以使用以下代码存档数组:

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)
do {
    let childsData = try NSKeyedArchiver.archivedData(withRootObject: childsArray!, requiringSecureCoding: true)
    UserDefaults.standard.set(childsData, forKey: "childsArray")
    UserDefaults.standard.synchronize()
} catch {
    print(error)
}
do {
    let childData = UserDefaults.standard.value(forKey: "childsArray")
    if let childArray = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(childData as! Data) {
        print(childArray)
    }
} catch {
    print(error)
}
以及使用以下代码的非归档对象:

do {
    let childsData = try NSKeyedArchiver.archivedData(withRootObject: childsArray!, requiringSecureCoding: true)
    UserDefaults.standard.set(childsData, forKey: "childsArray")
    UserDefaults.standard.synchronize()
} catch {
    print(error)
}
do {
    let childData = UserDefaults.standard.value(forKey: "childsArray")
    if let childArray = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(childData as! Data) {
        print(childArray)
    }
} catch {
    print(error)
}

如果你能解释一下这段代码是如何解决OP的问题的,那会很有帮助。