所以我在这里有一个基本设置
var preferenceSpecification = [String : String?]()
preferenceSpecification["Key"] = "Some Key"
preferenceSpecification["Some Key"] = nil
preferenceSpecification["DefaultValue"] = "Some DefaultValue"
print(preferenceSpecification)
var defaultsToRegister = [String : String]()
if let key = preferenceSpecification["Key"], let defaultValueKey = preferenceSpecification["DefaultValue"] {
defaultsToRegister[key] = preferenceSpecification[defaultValueKey]!
}
但是这个错误指出了它要求我强行打开它的地方,就像这样:
defaultsToRegister[key!] = preferenceSpecification[defaultValueKey!]!
哪个没有意义,因为 keyValue 和 defaultValue 已经解开了
答案 0 :(得分:2)
使用下标
从字典中提取值时[String: String?]
您需要管理2个级别的可选项。第一个因为下标返回一个可选项。第二个因为你的字典值是一个可选的字符串。
所以当你写
if let value = preferenceSpecification["someKey"] {
}
您将值定义为可选字符串。
这是解决该问题的代码
if let
optionalKey = preferenceSpecification["Key"],
key = optionalKey,
optionalDefaultValueKey = preferenceSpecification["DefaultValue"],
defaultValueKey = optionalDefaultValueKey,
value = preferenceSpecification[defaultValueKey] {
defaultsToRegister[key] = value
}
!
放在一行!答案 1 :(得分:1)
您还可以定义扩展名,以帮助避免出现双重可选情况。
extension Dictionary where Value == Optional<String> {
func flattened(_ key: Key) -> Value {
if let value = self[key] {
return value
}
return nil
}
}
用法:preferenceSpecification.flattened("someKey")