Optional — specjalny typ w Swift, który może zawierać wartość typu T lub nie zawierać jej w ogóle (nil). Zapisuje się jako T?. Pozwala jasno wskazać, że zmienna może nie mieć wartości i gwarantuje sprawdzenie obecności wartości na etapie kompilacji.
Mechanizmy wyciągania wartości:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(MOŻE prowadzić do awarii runtime, jeśli wartość to nil)
let length = str?.count
??):let value = str ?? "default"
Czy można przypisać nil zmiennej typu String, a nie String?, i co się stanie?
Odpowiedź:
Nie, zmiennej zwykłego typu (String) nie można przypisać wartości nil. Tylko optional może być nil, w przeciwnym razie wystąpi błąd kompilacji.
Przykład:
var a: String // a = nil // błąd kompilacji: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
Historia
W aplikacji przy force unwrapping wartości, sądząc, że z bazy zawsze przyjdzie poprawna odpowiedź, wystąpił crash przy braku pola. Błąd został rozwiązany przez dodatkowe sprawdzenie za pomocą optional binding.
Historia
Przy wysyłaniu powiadomień push nazwa użytkownika była przechowywana w zmiennej nie-optional, co prowadziło do awarii aplikacji przy pustej nazwie z API. Po analizie typ zmieniono na optional, dodano obsługę nil.
Historia
W projekcie przy przekazywaniu optional wartości do funkcji, argument został zadeklarowany bez optional-typu. Pojawiły się ukryte błędy i awarie. Wprowadzono zmiany: typ parametru stał się optional, dodano sprawdzenia obecności wartości.