Как развернуть необязательное значение словаря в Swift 4+ за один шаг? - PullRequest
0 голосов
/ 23 ноября 2018

Учитывая словарь словаря ниже, каков правильный синтаксис для развертывания Int?за один шаг?

let dict:Dictionary<String, Dictionary<String, Int?>> = [
"parentKey" : [
    "firstKey" : 1,
    "secondKey" : nil]
]

let x = "someKey"
let y = "someOtherKey"
var foo = 0

if let goo = dict[x]?[y] { foo = goo } //<-- Error: cannot assign (Int?) to Int

if let goo = dict[x]?[y], let boo = goo { foo = boo } //<-- OK

В первом 'if let', goo возвращается как Int?- тогда нужно развернуть goo, как во втором «if let» ...

Каков правильный синтаксис для выполнения этого за один шаг?

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Насколько я понял, вы хотите принудительно развернуть двойную опцию.Есть разные методы.

let dbOpt = dict[x]?[y]

Мой любимый:

if let goo = dbOpt ?? nil { foo = goo } 

Использование flatMap:

if let goo = dbOpt.flatMap{$0} { foo = goo } 

Использование сопоставления с образцом:

if case let goo?? = dbOpt { foo = goo }
0 голосов
/ 23 ноября 2018

Есть много способов сделать это, но одно из самых простых доступных решений:

var foo = 0

if let goo = dict[x]?[y]  as? Int{
    foo = goo
}
print(foo)
0 голосов
/ 23 ноября 2018

Используйте nle colesecing и укажите значение по умолчанию.Единственный способ безопасно развернуть значение словаря.

if let goo = dict[x]?[y] ?? NSNotFound { foo = goo }  
...