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.

Big 91f67345 75e1 462f 8a86 94007e21616f

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.