Swift dla początkujących: Optionals
Jednym z pierwszych elementów rzucających się w oczy podczas analizy kodu źródłowego aplikacji napisanych w języku Swift są występujące w różnych miejscach znaki zapytania i wykrzykniki. Są to tzw. Optionals. Postarajmy się zrozumieć podstawową zasadę funkcjonowania tego mechanizmu.
Czym są Optionals?
Aby zrozumieć jak działają Optionals posłużymy się przykładem. Powiedzmy, że potrzebujemy podstawowych danych osobowych użytkownika aplikacji, takich jak imię - firstName
, drugie imię -
middleName
oraz nazwisko - lastName
. W tym celu utworzymy trzy zmienne typu tekstowego String
.
var firstName: String
var middleName: String
var lastName: String
Zainicjalizujemy nasze zmienne nadając im wartości.
firstName = "Jan"
middleName = "Sebastian"
lastName = "Bach"
Wszystko jak do tej pory działa prawidłowo, co jednak gdy nasz użytkownik nie ma drugiego imienia? Zmienna middleName
nie zostanie w ogóle zainicjalizowana i nie będziemy mogli z niej korzystać w dalszym kodzie. W takim właśnie przypadku z pomocą przychodzą Optionals. Aby nasza zmienna mogła nie posiadać wartości musi zostać zadeklarowana jako Optionals, tj. jako zmienna przyjmująca wartość o zadeklarowanym typie lub specjalną wartość nil
reprezentującą brak przypisanych danych. Optionals tworzymy poprzez wstawienie znaku zapytania po deklaracji typu zmiennej.
var firstName: String
var middleName: String?
var lastName: String
W ten sposób zadeklarowaliśmy zmienną middleName
jako Optionals, czyli w naszym przypadku zmienną mogącą przechowywać wartość tekstową String
lub nie posiadać żadnej wartości (nil
). Możemy w takim wypadku posłużyć się kodem:
//pierwszy użytkownik
firstName = "Jan"
middleName = "Sebastian"
lastName = "Bach"
//drugi użytkownik
firstName = "Jan"
middleName = nil
lastName = "Kowalski"
Unwrapping
Stosowanie zmiennych które opcjonalnie mogą nie posiadać przypisanej wartości niesie ze sobą ryzyko wystąpienia błędów. W związku z tym, jeśli kompilator napotka w naszym kodzie operację na zmiennej która przyjmować może wartość nil
dla bezpieczeństwa nie pozwoli na jego kompilację. W takim wypadku, jeżeli chcemy skorzystać z takiej zmiennej musimy sprawdzić czy posiada ona przypisaną wartość. Takie sprawdzenie nosi nazwę odpakowania zmiennej (Unwrapping).
Unwrapping można przeprowadzić w tzw. bezpieczny sposób za pomocą instrukcji warunkowej if let
. Instrukcja warunkowa if let
tworzy stałą pomocniczą (niżej potentialmiddleName
) i sprawdza jaką przyjmuje ona wartość.
if let potentialmiddleName = middleName {
println(firstName + " " + potentialmiddleName + " " + lastName)
//jeżeli zmienna middleName posiada wartość, możemy skorzystać ze stałej potentialmiddleName która przechowuje jej wartość
}
else {
//jeżeli zmienna middleName nie posiada wartości po prostu ją pominiemy
println(firstName + " " + lastName)
}
Drugim sposobem na odpakowanie zmiennej jest tzw. forced unwrapping. Stosujemy go w momencie, w którym mamy pewność, że zmienna posiada wartość. Aby uzyskać w ten sposób dostęp do wartości zmiennej Optionals stawiamy bezpośrednio po jej nazwie znak wykrzyknika.
println(firstName + " " + middleName! + " " + lastName)
Forced unwrapping możemy również połączyć z instrukcją warunkową if
tworząc konstrukcję stosowaną w wielu innych językach programowania:
if middleName != nil{
//jeżeli zmienna middleName nie posiada wartości specjalnej nil oznacz że posiada wartość tekstową
println(firstName + " " + middleName! + " " + lastName)
}
else {
//w innym przypadku
println(firstName + " " + lastName)
}
Podsumowanie
W powyższym tekście przybliżyliśmy sobie podstawową zasadę funkcjonowania mechanizmu Optionals, należy jednak pamiętać, że jest to narzędzie posiadające znacznie szersze zastosowanie niż w przykładach, którymi się posłużyliśmy. Optionals są jednym z najważniejszych elementów filozofii języka Swift, determinującym jego bezpieczeństwo i bezawaryjność pisanych w nim aplikacji.