Ответ 1
(Обновлено для Swift> = 3)
"Double optionsals" могут быть полезны, а запись в блоге Swift "Вариант Caseases: valuesForKeys" описывает приложение.
Вот упрощенный пример:
let dict : [String : String?] = ["a" : "foo" , "b" : nil]
это словарь с необязательными строками в качестве значений. Следовательно
let val = dict[key]
имеет тип String??
aka Optional<Optional<String>>
. Это .none
(или nil
), если ключ отсутствует в словаре, а .some(x)
противном случае. Во втором случае x
является String?
aka Optional<String>
и может быть .none
(или nil
) или .some(s)
где s
- String.
Вы можете использовать вложенную необязательную привязку для проверки различных случаев:
for key in ["a", "b", "c"] {
let val = dict[key]
if let x = val {
if let s = x {
print("\(key): \(s)")
} else {
print("\(key): nil")
}
} else {
print("\(key): not present")
}
}
Выход:
a: foo
b: nil
c: not present
Возможно, было бы поучительно посмотреть, как это можно добиться при сопоставлении шаблонов в switch-statement:
let val = dict[key]
switch val {
case .some(.some(let s)):
print("\(key): \(s)")
case .some(.none):
print("\(key): nil")
case .none:
print("\(key): not present")
}
или, используя x?
шаблон как синоним .some(x)
:
let val = dict[key]
switch val {
case let (s??):
print("\(key): \(s)")
case let (s?):
print("\(key): nil")
case nil:
print("\(key): not present")
}
(Я не знаю разумного приложения для более глубоко вложенных опций).