0

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

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已经被解包

4

2 回答 2

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. 您还应该尝试为常量和变量使用更好的名称。
于 2016-08-18T19:58:43.853 回答
1

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

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

用法:preferenceSpecification.flattened("someKey")

于 2020-08-05T11:52:24.000 回答