如何将数组的数组保存到User Defaults?
解决UserDefaults保存和加载二维数组的问题
我来帮你搞定这个问题~你遇到的核心问题是加载时的类型转换错误,咱们一步步拆解:
问题出在哪?
你保存二维数组的代码其实是没问题的:
let arrayOfArrays = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]] UserDefaults.standard.set(arrayOfArrays, forKey: "SavedArrayOfArrays")
UserDefaults本身支持存储嵌套数组(只要元素是PropertyList兼容的基础类型,比如Int、String这些都没问题)。
但加载代码里的类型转换逻辑完全错了:
// 错误代码 arrayOfArrays = [defaults.object(forKey: "SavedArrayOfArrays") as? Array<Int> ?? Array<Int>()]
你试图把取出的二维数组对象转换成单维Int数组,转换失败后就用了一个空的单维数组,最后还把这个空数组包进了另一个数组里,结果自然就变成[[]]了。
正确的加载方式
直接把取出的对象转换成二维Int数组类型[[Int]](或者Array<Array<Int>>)就行:
// 正确的加载代码 var arrayOfArrays: [[Int]] = [] arrayOfArrays = UserDefaults.standard.object(forKey: "SavedArrayOfArrays") as? [[Int]] ?? [[Int]]() // 更简洁的写法(用array(forKey:)方法) arrayOfArrays = UserDefaults.standard.array(forKey: "SavedArrayOfArrays") as? [[Int]] ?? []
这样如果UserDefaults里存在对应Key的二维数组,就能正确取出;如果不存在或者类型不匹配,就会初始化一个空的二维数组。
完整示例代码
把保存和加载放在一起的完整可运行示例:
// 初始化二维数组 var arrayOfArrays = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]] let defaults = UserDefaults.standard // 保存到UserDefaults defaults.set(arrayOfArrays, forKey: "SavedArrayOfArrays") // 从UserDefaults加载 arrayOfArrays = defaults.object(forKey: "SavedArrayOfArrays") as? [[Int]] ?? [] print(arrayOfArrays) // 会输出[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
内容的提问来源于stack exchange,提问作者Alan Cole




