尝试将字典存入UserDefaults致应用崩溃,寻求解决方案
解决UserDefaults存储字典崩溃的问题
嘿,我一眼就瞅出问题所在啦!你遇到的崩溃,根源在于UserDefaults(或者说它底层依赖的plist文件)要求存储的字典键必须是String类型,而你代码里的test字典用了Int类型的键1,这直接违反了plist的规则,所以应用一运行就崩溃了。
为什么会这样?
UserDefaults的本质是把数据序列化到plist文件里,而plist格式规定字典的键只能是字符串(对应OC的NSString,Swift的String),不管你用原生Swift Dictionary还是NSDictionary,只要键不是字符串类型,写入时都会触发崩溃。
修复方案
有两种简单的解决办法:
1. 直接使用String类型作为字典键
把你的字典改成用字符串当键,这样就能直接存入UserDefaults了:
class CourseVC: UIViewController { // 把Int键改成String类型 let test = ["1":"me"] override func viewDidLoad() { super.viewDidLoad() let defaults = UserDefaults.standard defaults.set(test, forKey: "dict1") } }
2. 保留Int逻辑键,存前转成String
如果你的业务逻辑里必须用Int作为键,那可以在存储前把字典的键转成String,读取的时候再转回来:
class CourseVC: UIViewController { // 保留Int键的原始字典 let test = [1:"me"] override func viewDidLoad() { super.viewDidLoad() let defaults = UserDefaults.standard // 把Int键转成String let stringKeyDict = test.reduce(into: [String: String]()) { result, pair in result[String(pair.key)] = pair.value } // 存储转换后的字典 defaults.set(stringKeyDict, forKey: "dict1") // 读取的时候再转回来(可选) if let savedDict = defaults.dictionary(forKey: "dict1") as? [String: String] { let originalDict = savedDict.reduce(into: [Int: String]()) { result, pair in if let key = Int(pair.key) { result[key] = pair.value } } // 这里就拿到了原始的Int键字典 } } }
这样修改后,应用就不会崩溃啦,数据也能正常存入UserDefaults~
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

