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.