【发布时间】:2020-03-04 07:06:12
【问题描述】:
Ios 开发新手。目前是一个返回 NSMutableDictionary 的函数,它存储在 userDefaults 中。但是,当我从 userdefault 检索值时,它返回的 NSMutableDictionary 格式不正确,它无法解析 NSMutableDictionary 并返回错误“无法将 '__NSSingleEntryDictionaryI' 类型的值转换为 NSMutableDictionary”。
返回 NSMutableDictionary 的函数
func initializeStructureOfControl () -> NSMutableDictionary {
var parentSlideControl = NSMutableDictionary()
var slideControl = NSMutableDictionary()
slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.fdtControlKey)
slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.pdtControlsData)
slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.eeControlsData)
slideControl.setValue(NSMutableDictionary(), forKey: UserDefaultKeys.fbeControlsData)
parentSlideControl.setValue(slideControl, forKey: UserDefaultKeys.slideControlKey)
return parentSlideControl
}
在用户默认中初始化
UserDefaults.standard.setValue( initializeStructureOfControl(), forKey: UserDefaultKeys.slideControlKey)
检索值
UserDefaults.standard.object(forKey: UserDefaultKeys.slideControlKey)
userdefault 中保存的值:
▿ some : 1 element
▿ 0 : 2 elements
▿ key : slideControlsData
▿ value : 4 elements
▿ 0 : 2 elements
- key : fbeControlsData
- value : 0 elements
▿ 1 : 2 elements
- key : eeControlsData
- value : 0 elements
▿ 2 : 2 elements
- key : fdtControlsData
- value : 0 elements
▿ 3 : 2 elements
- key : pdtControlsData
- value : 0 elements
用户默认返回的值
▿ some : 1 element
▿ 0 : 2 elements
▿ key : slideControlsData
▿ value : 4 elements
▿ 0 : 2 elements
- key : fbeControlsData
- value : 0 elements
▿ 1 : 2 elements
- key : eeControlsData
- value : 0 elements {.....}
▿ 2 : 2 elements
- key : fdtControlsData
- value : 0 elements {.....}
▿ 3 : 2 elements
- key : pdtControlsData
- value : 0 elements {.....}
虽然它在 ios 12 或之前的设备上工作(返回与保存相同的值)但在 ios 13 及更高版本上返回上述格式字符串,而不是在用户默认值中保存一个。
【问题讨论】:
-
不要在 Swift 中使用 objective-c-ish
NSMutable...集合类型。并且不要使用setValue(forKey,除非你知道 KVC 是什么并且你真的需要 KVC。发生错误是因为您从未从UserDefaults和object(forKey获得可变集合类型,即使在 Objective-C 中也没有。 -
我应该用什么替代 NSMutableDictionary?因为目前整个应用程序都使用 NSMutableDictionary。
-
使用 Swift 原生类型
[String:Any]。它以variable 的形式免费提供可变性。