You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将数组的数组保存到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

火山引擎 最新活动