Optional is een speciaal type in Swift dat een waarde van type T kan bevatten of helemaal geen waarde kan bevatten (nil). Het wordt genoteerd als T?. Hiermee kan expliciet worden aangegeven dat een variabele mogelijk geen waarde heeft, en het garandeert controle op de aanwezigheid van een waarde tijdens het compileren.
Mechanismen voor waarde-extractie:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(DIT KAN leiden tot een runtime crash als de waarde nil is)
let length = str?.count
??):let value = str ?? "default"
Kan je nil toewijzen aan een variabele van het type String, en niet String?, en wat gebeurt er?
Antwoord:
Nee, aan een gewone variabele van het type (String) kan geen waarde nil worden toegewezen. Alleen optionals kunnen nul zijn, anders ontstaat er een compilatiefout.
Voorbeeld:
var a: String // a = nil // compilatiefout: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
Verhaal
In de applicatie leidde force unwrapping van de waarde, in de veronderstelling dat er altijd een correcte respons uit de database zou komen, tot een crash bij het ontbreken van een veld. De fout werd opgelost door een extra controle via optional binding.
Verhaal
Bij het verzenden van pushmeldingen werd de gebruikersnaam opgeslagen in een niet-optional variabele, wat leidde tot een crash van de applicatie bij een lege naam uit de API. Na analyse werd het type vervangen door optional en werd de afhandeling van nil toegevoegd.
Verhaal
In een project, bij het doorgeven van een optional waarde aan een functie, was de parameter zonder optional-type gedeclareerd. Dit leidde tot verborgen bugs en crashes. Wijzigingen werden aangebracht: het type van de parameter werd optional, en er werden controles op de aanwezigheid van een waarde toegevoegd.