Swift中UserDefaults标准与自定义套件键值互现的原因问询
UserDefaults不同套件出现交叉键值的原因
核心原因:套件继承机制与dictionaryRepresentation()的返回逻辑
- 套件的继承关系:通过
suiteName创建的自定义UserDefaults套件,会自动将UserDefaults.standard(标准套件)作为其父套件。自定义套件会继承父套件的所有注册默认值和已存储的持久化值。 dictionaryRepresentation()的行为:这个方法返回的并非当前套件独有的键值对,而是当前套件能访问到的所有键值的集合——包括自身存储的持久化值、自身注册的默认值,以及从父套件继承来的所有内容。
具体到你的场景
- 自定义套件的
dictionaryRepresentation()同时出现standardA和customA是正常的:standardA是从标准套件继承的注册默认值,customA是自身注册的默认值。 - 标准套件的
dictionaryRepresentation()出现customA,大概率是代码误操作导致的:- 可能在注册默认值时,不小心将
customA注册到了UserDefaults.standard而非自定义套件; - 可能在某个逻辑中,误将
customA的值写入了标准套件。
- 可能在注册默认值时,不小心将
验证方法
可以通过以下代码分别确认两个套件的自有内容:
// 检查标准套件的自有存储值(无父套件,无需考虑继承) let standardStored = UserDefaults.standard.dictionaryRepresentation().filter { key, _ in UserDefaults.standard.object(forKey: key) != nil } print("标准套件自有存储值:\(standardStored)") // 检查自定义套件的自有存储值 let customUD = UserDefaults(suiteName: "com.domain.custom")! let customStored = customUD.dictionaryRepresentation().filter { key, _ in customUD.object(forKey: key) != nil } print("自定义套件自有存储值:\(customStored)")
如果标准套件的自有存储值中没有customA,说明customA是被误注册到标准套件的默认值里了。
内容的提问来源于stack exchange,提问作者markb
相关产品推荐
相关产品推荐

