W języku Swift, w jaki sposób mogę napisać przypadek w instrukcji switch, która testuje przełączaną wartość względem zawartości opcjonalnej , pomijając wielkość liter, jeśli opcja zawiera nil
?
Oto jak to sobie wyobrażam:
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
}
Jeżeli po prostu napisać go dokładnie tak, kompilator narzeka, że someOptional
nie jest rozpakowany, ale gdybym nim wyraźnie unwrap dodając !
do końca, ja oczywiście się błąd wykonania o każdej porze someOptional
zawiera nil
. Dodanie ?
zamiast tego !
miałoby dla mnie jakiś sens (w duchu opcjonalnego łączenia w łańcuch, jak przypuszczam), ale nie usuwa błędu kompilatora (tj. Faktycznie nie rozpakowuje opcjonalnego).
źródło
Począwszy od Xcode 7, „nowy
x?
wzorzec może być używany do dopasowania wzorca do opcji jako synonim.some(x)
”. Oznacza to, że w Swift 2 i późniejszych działa również następująca odmiana odpowiedzi rintaro :let knownValue = 5 switch someOptional { case knownValue?: // Contents of someOptional are knownValue, defined above. case let otherValue?: // Contents of someOptional are *any* non-nil value not already tested for. // Unwrapped contents are assigned to otherValue for use inside this case. default: // someOptional is nil. }
źródło
someValue?
jest inną zdefiniowaną wartością, ale czycase let val?
jest to tylko bezpieczna nieopakowana wersjasomeOptional
?!let
kompilacji już się nie kompiluje. W tej chwili nie pamiętam, dlaczego to zadziałało kiedyś.W Swift 4 możesz użyć Optional: ExpressibleByNilLiteral firmy Apple, aby opakować opcjonalne
https://developer.apple.com/documentation/swift/optional
Przykład
enum MyEnum { case normal case cool }
trochę
let myOptional: MyEnum? = MyEnum.normal switch smyOptional { case .some(.normal): // Found .normal enum break case .none: break default: break }
Żaden
let myOptional: MyEnum? = nil switch smyOptional { case .some(.normal): break case .none: // Found nil break default: break }
domyślna
let myOptional: MyEnum? = MyEnum.cool switch smyOptional { case .some(.normal): break case .none: break default: // Found .Cool enum break }
Wyliczenie z wartością
enum MyEnum { case normal(myValue: String) case cool }
jakąś wartość
let myOptional: MyEnum? = MyEnum.normal("BlaBla") switch smyOptional { case .some(.normal(let myValue)) where myValue == "BlaBla": // Here because where find in my myValue "BlaBla" break // Example for get value case .some(.normal(let myValue)): break // Example for just know if is normal case enum case .some(.normal): break case .none: break default: break }
źródło
ExpressibleByNilLiteral
ale wtedy to nie jest faktycznie używane w deklaracjach wyliczeniowych itp. Co to jest?