Swift: Optional

Opublikowano: 17.08.2023 - tagi: Swift Optional

Czym jest Optional?

Swift daje programiście do ręki typ danych o nazwie Optional, który służy do przechowania jakiejś wartości lub nic (nil). Ten typ można porównać do pudełka, które może coś posiadać lub będzie puste.

Jest to przydatne szczególnie wtedy, gdy nie jesteśmy pewni, czy do zmiennej przypisana zostania jakaś wartość.

Domyślną wartością dla Optional jest nil — co oznacza brak wartości.

Jeśli zmienna oznaczona jako Optional ma wartość, jest ona opakowana przez typ Optional.

Jak stworzyć Optional?

Typ Optional można stworzyć na kilka sposobów:

var a: Optional<String> = "Test 1"
var b: String? = "Test 2"
var c: String! = "Test 3"
var d: String?
var e: String!

print(a) // Optional("Test 1")
print(b) // Optional("Test 2")
print(c) // Optional("Test 3")
print(d) // nil
print(e) // nil

Jak widać każda zmienna, która nie jest nil — która ma wartość, jest opakowana w Optional. Jak dostać się do tej wartości?

Jak pobrać wartość z Optional?

String i Optional (lub: String?) to dwa różne typy danych! Na Optional powinieneś patrzeć, jak na kontener, który może coś zawierać bądź nie (nil).

Dostęp do wartości Optional

Jeśli zmienna/stała przechowuje nil dostęp do niej łatwy. Żeby wyłuskać wartość z Optional, możesz napisać:

var a: String? = "Test 1"
print(a!) // Test 1

Zauważ, że jeśli napiszesz:

var a: String? = "Test 1"
print(a) // Optional<Test 1>

masz dostęp do Optional, które zawiera wartość.

Optional rozpakowany

Taki zapis:

var a: String! = "Test 1"
print(a) // Test 1

sprawia, że Optional zostanie stworzony. Ale zauważ, żeby pobrać wartość, nie musisz już użyć !.

Z takim zapisem należy uważać:

var a: String!
print(a.count)

W tym przypadku program się wysypie. Ponieważ a jest nil. Dlatego, zanim to użyjesz, warto mieć pewność, że zmienna posiada wartość.

Inny przykład:

var a: String!
var b: String = a

W momencie przypisania a do b program także przestanie działać. Dzieje się tak dlatego, bo a jest nil. Przy próbie przypisania tego do b powoduje błąd. Próba przypisania nil do zmiennej, która nie jest Optional spowoduje błąd.

Jak poradzić sobie z takimi sytuacjami?

Czy Optional ma wartość?

Istnieje kilka sposób na sprawdzenie, czy Optional posiada wartość. Poniżej lista:

Instrukcja if

var a: String?

if a != nil {
  print(a)
}

Instrukcja if-let

var a: String?

if let tempA = a {
  print(tempA)
}

Tutaj tworzona jest zmienna tymczasowa: tempA. Jeśli a nie jest nil do tempA przypisana jest wartość i warunek jest spełniony.

Instrukcja guard

var a: String?

guard a {
  return
}

print(a!)

Operator ??

var a: String?

print(a ?? '')

Operator ?? spróbuje pobrać wartość z a. Jeśli jest to nil, zwróci to co podałeś po prawej stronie operatora. W tym przypadku pusty ciąg znaków.