RodolfoAntonici
RodolfoAntonici

Reputation: 1635

Swift Optional Dictionary [String: String?] unwrapping error

So here I have a basic setup

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

But the error points out where it demands that I force unwrap this, to be like this:

defaultsToRegister[key!] = preferenceSpecification[defaultValueKey!]!

Which doesn't make sense, because keyValue and defaultValue already are unwrapped

Upvotes: 0

Views: 1745

Answers (2)

Balázs Vincze
Balázs Vincze

Reputation: 3840

You could also define an extension which helps get rid of the double optional situation.

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

Usage: preferenceSpecification.flattened("someKey")

Upvotes: 1

Luca Angeletti
Luca Angeletti

Reputation: 59536

When you extract a value from a dictionary like this using subscript

[String: String?]

you need to manage 2 levels of optional. The first one because the subscript returns an optional. The second one because the value of you dictionary is an optional String.

So when you write

if let value = preferenceSpecification["someKey"] {

}

you get value defined as an optional String.

Here's the code to fix that

if let
    optionalKey = preferenceSpecification["Key"],
    key = optionalKey,
    optionalDefaultValueKey = preferenceSpecification["DefaultValue"],
    defaultValueKey = optionalDefaultValueKey,
    value = preferenceSpecification[defaultValueKey] {
    defaultsToRegister[key] = value
}

Suggestions

  1. You should avoid force unwrapping as much as possible. Instead you managed to put 3 ! on a single line!
  2. You should also try to use better name for your constants and variables.

Upvotes: 2

Related Questions