Idiom do radzenia sobie z opcjami w Swift wydaje się nadmiernie rozwlekły, jeśli wszystko, co chcesz zrobić, to podać wartość domyślną w przypadku, gdy jest zerowa:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
co wiąże się z niepotrzebnym powielaniem kodu lub
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
która unwrappedValue
nie wymaga stałej.
Monada Option Scali (która jest w zasadzie tym samym pomysłem co opcja Swift) ma metodę getOrElse
do tego celu:
val myValue = optionalValue.getOrElse(defaultValue)
Czy coś mi brakuje? Czy Swift ma już na to kompaktowy sposób? Lub, jeśli to nie wystarczy, czy można zdefiniować getOrElse
rozszerzenie dla Optional?
Odpowiedzi:
Aktualizacja
Firma Apple dodała teraz operatora koalescencji:
Operator trójskładnikowy jest w tym przypadku Twoim przyjacielem
Możesz także podać własne rozszerzenie opcjonalnego wyliczenia:
Następnie możesz po prostu zrobić:
Zalecam jednak trzymać się operatora trójskładnikowego, ponieważ inni programiści zrozumieją to znacznie szybciej bez konieczności badania
or
metodyUwaga : Zacząłem moduł dodawania wspólne pomocników tak
or
naOptional
SWIFT.źródło
unwrappedValue
jest nadal opcjonalnym typem dla tego przypadku w Swift 1.2:var unwrappedValue = optionalValue ? optionalValue! : defaultValue
(xcode 6 beta 4). Czy to się zmieniło???
domyślne zachowanie wnioskowania o typie polega na tym, że zwraca opcjonalne, co zwykle nie jest tym, czego chcesz. Możesz zadeklarować zmienną jako nieobowiązkową i to działa dobrze.Od sierpnia 2014 r. Swift ma operatora koalescencji (??), który to umożliwia. Na przykład dla opcjonalnego String myOptional można napisać:
źródło
jeśli napisałeś:
a
optionalValue != nil
potem teżresult
będzieoptional
i będziesz musiał go rozpakować w przyszłościAle możesz napisać operator
Teraz możesz:
A kiedy
optionalValue != nil
toresult
będzieunwraped
źródło
Następujące wydaje się działać
jednak potrzeba rzucania
value as T
jest brzydka. W idealnym przypadku powinien istnieć sposób potwierdzenia, żeT
jest taki sam, jak typ zawarty w pliku Optional. W obecnej postaci wpisz zestawy wnioskowaniaT
na podstawie parametru podanego w getOrElse, a następnie zakończy się niepowodzeniem w czasie wykonywania, jeśli nie jest to zgodne z wartością opcjonalną, a wartość opcjonalna jest różna od zera:źródło
T
metody. To faktycznie zastępuje istniejąceT
z Optional. Możesz po prostu zrobić:func getOrElse(defaultValue: T) -> T
wtedy T odnosi się do rzeczywistego typu wartości opcjonalnej i nie musisz wpisywać, sprawdź toT
w ten sposób? (poza prostym założeniem opartym na konwencji)Optional
wewnątrz Xcode, zobaczysz, że jest zdefiniowany jakoenum Optional<T>