Swift读取UserDefaults存储的Int数组赋值到自定义数组时为空问题求解
问题原因
- 你存储到UserDefaults的是一维Int数组
[Int]类型,但代码中读取时尝试转换为[[Int:Any]](字典组成的数组),两种类型完全不匹配,所以类型转换会直接失败,最终intArray被赋值为??运算符后面的默认空数组。 - 你直接打印
defaults.array(forKey: "Favorites")能看到正常输出,是因为这个方法返回的是可选[Any]类型,本身是有值的,只是强转成不符合的类型时才会返回nil。
修复方案
- 首先修正顶层变量的类型声明,把
intArray修改为和存储数据匹配的[Int]类型:
let defaults = UserDefaults.standard // 原声明是字典数组,改为和存储数据匹配的Int数组 var intArray = [Int]()
- 调整
viewDidLoad中的读取转换逻辑,对应修改类型转换的目标类型:
override func viewDidLoad() { super.viewDidLoad() // 转换目标改为[Int],和存储的类型对齐 intArray = defaults.array(forKey: "Favorites") as? [Int] ?? [] print(intArray) }
补充说明
- UserDefaults读写数据时必须保证读写的类型完全一致,否则就会出现转换失败取值为空的问题。如果后续需要存储更复杂的自定义结构,建议先通过Codable协议转成Data再存储到UserDefaults中。
内容的提问来源于stack exchange,提问作者Douglas W. Palme
相关产品推荐
相关产品推荐

