Wie kann ich in Swift einen Fall in eine switch-Anweisung schreiben, die den Wert, der umgeschaltet wird, mit dem Inhalt einer Option vergleicht und den Fall überspringt, wenn die Option enthält nil
?
So stelle ich mir das vor:
let someValue = 5
let someOptional: Int? = nil
switch someValue {
case someOptional:
// someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
// either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}
Wenn ich es nur schreiben genau so, beschwert sich der Compiler , dass someOptional
nicht ausgepackt ist, aber wenn ich unwrap es ausdrücklich durch Zugabe !
bis zum Ende, ich natürlich einen Laufzeitfehler erhalten jederzeit someOptional
enthält nil
. Das Hinzufügen ?
statt !
würde für mich einen Sinn ergeben (im Geiste der optionalen Verkettung, nehme ich an), lässt aber den Compilerfehler nicht verschwinden (dh das optionale nicht auspacken).
quelle
Ab Xcode 7 (aus den Beta 1-Versionshinweisen) kann "ein neues
x?
Muster verwendet werden, um Musterübereinstimmungen mit Optionen als Synonym für.Some(x)
". Dies bedeutet, dass in Xcode 7 und höher auch die folgende Variante der Antwort von rintaro funktioniert:quelle
someValue?
ist ein anderer definierter Wert, abercase let val?
ist nur die sichere unverpackte Version vonsomeOptional
?!let
nicht mehr kompiliert wird. Ich kann mich jetzt nicht erinnern, warum das früher funktioniert hätte.In Swift 4 können Sie Optional: ExpressibleByNilLiteral von Apple verwenden, um optional zu verpacken
https://developer.apple.com/documentation/swift/optional
Beispiel
etwas
keiner
Standard
Aufzählung mit Wert
ein Wert
quelle