(Aktualizacja dla Swift 2.)
"Double OPCJE" może być przydatna, a wpis w blogu Swift "Optionals Case Study: valuesForKeys" opisuje aplikację.
Oto uproszczony przykład:
let dict : [String : String?] = ["a" : "foo" , "b" : nil]
jest słownikiem z opcjonalnymi ciągi jako wartości. Dlatego
let val = dict[key]
ma typ String??
aka Optional<Optional<String>>
. Jest .None
(lub nil
) , jeśli klucz nie jest obecny w słowniku, a .Some(x)
w przeciwnym razie. W drugim przypadku x
jest String?
aka Optional<String>
i może być .None
(lub nil
) lub .Some(s)
gdzie s
jest String.
Można używać zagnieżdżonych opcjonalne wiązanie do sprawdzenia różnych przypadkach:
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")
}
}
wyjściowa:
a: foo
b: nil
c: not present
To może być pouczające, aby zobaczyć jak to samo można osiągnąć dopasowując wzór w instrukcja zmiany:
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")
}
lub przy użyciu x?
wzór jako synonim dla .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")
}
(nie wiem sensowny wniosek o głębiej zagnieżdżonych optionals.)
Co więcej, aby być wyczerpującym, należy spróbować? ... tak jak? ... 'zwróci podwójną Opcjonalnie. –
@ Cœur: Tak, ale można to rozwiązać za pomocą nawiasów: 'if let value = (try? ...) as? ... {...} ', ponieważ opcjonalne powiązanie opcjonalne nie dodaje kolejnego opcjonalnego poziomu. –
Następnie inny przykład, "UIApplication.shared.delegate? .window" jest podwójnym opcjonalnym. Będziesz musiał dodać '??', aby rozwinąć okno. –