Swift Optional Dictionary [String:String?]展开错误

时间:2016-08-18 19:39:35

标签: swift dictionary unwrap optional-variables

所以我在这里有一个基本设置

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 已经解开了

2 个答案:

答案 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. 你应该尽可能避免强行打开。相反,你设法将3 !放在一行!
  2. 您还应该尝试为常量和变量使用更好的名称。

答案 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")