You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

尝试将字典存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:57:34