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!]!

这没有意义,因为 keyValuedefaultValue 已经展开

当您像这样使用下标从字典中提取值时

[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
}

建议

  1. 你应该尽可能避免强行展开。相反,您设法将 3 ! 放在一行中!
  2. 您还应该尝试为常量和变量使用更好的名称。

您还可以定义一个扩展,帮助摆脱双重可选的情况。

extension Dictionary where Value == Optional<String> {
    
    func flattened(_ key: Key) -> Value {
        if let value = self[key] {
            return value
        }
        return nil
    }
        
}

用法:preferenceSpecification.flattened("someKey")