Achtergrond van de vraag:
Optional chaining is geïntroduceerd in Swift om het werken met geneste optionals gemakkelijker te maken, zodat je compacte en veilige code kunt schrijven zonder eindeloze null-controles. Dit is vooral handig bij het aanspreken van eigenschappen en methoden van objecten die mogelijk ontbreken.
Probleem:
Bij het werken met optional chaining kan het gemakkelijk zijn om verkeerd te begrijpen welk resultaat je krijgt als een van de objecten in de keten gelijk is aan nil, of als je de teruggegeven waarde op de verkeerde manier verwerkt, kun je tegen runtime-fouten of onverwacht gedrag aanlopen.
Oplossing:
Optional chaining is een mechanisme dat veilig toegang biedt tot geneste eigenschappen, methoden en subscripties van objecten die nil kunnen zijn. Als een element in de keten nil is, geeft de hele constructie nil terug zonder een fout te genereren.
Voorbeeldcode:
class Address { var city: String? } class User { var address: Address? } let user: User? = User() user?.address?.city = "Moskou" if let city = user?.address?.city { print(city) } else { print("Stad niet gevonden") }
Belangrijkste kenmerken:
Leidt het aanroepen van een methode of het verkrijgen van een eigenschap via optional chaining tot een runtime-fout als het object nil is?
Nee, er treedt geen runtime-fout op. Het gehele expressie via optional chaining geeft nil terug, de uitvoering wordt onderbroken zonder fout.
Voorbeeldcode:
let email: String? = nil let lowercased = email?.lowercased() // lowercased zal nil zijn, er treedt geen fout op
Zal de toewijzing via optional chaining plaatsvinden als het tussenliggende object ontbreekt?
Nee, als het object of tussenliggende eigenschap nil is, zal de toewijzing niets effect hebben en het geheugen niet veranderen.
Voorbeeldcode:
var user: User? = nil user?.address?.city = "Kazan" // er gebeurt niets, user is nil
Kan het resultaat van optional chaining niet optional zijn?
Nee, het resultaat van elke expressie via optional chaining is altijd optional, zelfs als de oorspronkelijke eigenschap niet optional is.
Voorbeeldcode:
class Test { var number: Int = 10 } let t: Test? = nil let value = t?.number // value: Int? (optional)
In de code wordt user?.address?.city aangesproken zonder een controle op de aanwezigheid van de stad en wordt city! onmiddellijk afgedrukt. Dit leidt tot een crash als een schakel nil is.
Voordelen:
Nadelen:
In de code wordt if let of guard let gebruikt om user?.address?.city te controleren en pas daarna wordt er met de waarde gewerkt.
Voordelen:
Nadelen: