Swift 可选字典 [String: String?] 展开错误
Swift Optional Dictionary [String: String?] unwrapping error
所以这里我有一个基本设置
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 已经展开
当您像这样使用下标从字典中提取值时
[String: String?]
您需要管理 2 个可选级别。第一个因为下标returns一个可选。第二个是因为你字典的值是一个可选的字符串。
所以当你写
if let value = preferenceSpecification["someKey"] {
}
您获得定义为可选字符串的值。
这是修复该问题的代码
if let
optionalKey = preferenceSpecification["Key"],
key = optionalKey,
optionalDefaultValueKey = preferenceSpecification["DefaultValue"],
defaultValueKey = optionalDefaultValueKey,
value = preferenceSpecification[defaultValueKey] {
defaultsToRegister[key] = value
}
建议
- 你应该尽可能避免强行展开。相反,您设法将 3
!
放在一行中!
- 您还应该尝试为常量和变量使用更好的名称。
您还可以定义一个扩展,帮助摆脱双重可选的情况。
extension Dictionary where Value == Optional<String> {
func flattened(_ key: Key) -> Value {
if let value = self[key] {
return value
}
return nil
}
}
用法:preferenceSpecification.flattened("someKey")
所以这里我有一个基本设置
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 已经展开
当您像这样使用下标从字典中提取值时
[String: String?]
您需要管理 2 个可选级别。第一个因为下标returns一个可选。第二个是因为你字典的值是一个可选的字符串。
所以当你写
if let value = preferenceSpecification["someKey"] {
}
您获得定义为可选字符串的值。
这是修复该问题的代码
if let
optionalKey = preferenceSpecification["Key"],
key = optionalKey,
optionalDefaultValueKey = preferenceSpecification["DefaultValue"],
defaultValueKey = optionalDefaultValueKey,
value = preferenceSpecification[defaultValueKey] {
defaultsToRegister[key] = value
}
建议
- 你应该尽可能避免强行展开。相反,您设法将 3
!
放在一行中! - 您还应该尝试为常量和变量使用更好的名称。
您还可以定义一个扩展,帮助摆脱双重可选的情况。
extension Dictionary where Value == Optional<String> {
func flattened(_ key: Key) -> Value {
if let value = self[key] {
return value
}
return nil
}
}
用法:preferenceSpecification.flattened("someKey")