Să ai de-a face cu opționale poate părea greoi uneori, iar având mereu de desfăcut și verificat poate deveni atât de enervant încât ai putea fi tentat să folosești semne de exclamare și să desfaci forțat valori pentru a merge mai departe cu munca. Însă fii totuși atent: dacă desfaci forțat un opțional care nu are valoare, codul tău va crăpa.
Swift are două tehnici pentru a te ajuta să scrii cod mai puțin complicat. Prima se numește înlănțuirea opționalelor, și te lasă să rulezi codul doar dacă opționalul tău are o valoare. Scrie codul de jos în playground-ul tău pentru a începe:
func albumReleased(year: Int) -> String? {
switch year {
case 2006: return "Taylor Swift"
case 2008: return "Fearless"
case 2010: return "Speak Now"
case 2012: return "Red"
case 2014: return "1989"
default: return nil
}
}
let album = albumReleased(year: 2006)
print("The album is \(album)")
Asta va afișa "The album is Optional("Taylor Swift")" în panoul cu rezultate.
Dacă am fi vrut să convertim valoarea returnată de albumReleased()
în litere mari (adică, "TAYLOR SWIFT" în loc de "Taylor Swift") am fi putut apela metoda uppercased()
a acelui string. De exemplu:
let str = "Hello world"
print(str.uppercased())
Problema este că albumReleased()
returnează un string opțional: ar putea returna un string sau ar putea să nu returneze nimic. Deci, ceea ce vrem noi cu adevărat este că "dacă primim un string să-l convertim în litere mari, altfel să nu facem nimic". Iar aici intră în scenă înlănțuirea opționalelor, pentru că ne oferă exact acel comportament.
Încearcă să înlănțuiești ultimele două linii de cod în felul acesta:
let album = albumReleased(year: 2006)?.uppercased()
print("The album is \(album)")
Observă că acolo este un semnul întrebării, iar aceea este înlănțuirea opționalelor: orice se află după semnul întrebării va rula doar dacă ce se află înainte are valoare. Asta nu influențează tipul de date a variabilei album
, deoarece acea linie de cod acum va returna nil sau va returna numele albumului cu litere mari – este încă un string opțional.
Înlănțuirile tale de opționale pot fi cât de lungi ai nevoie, de exemplu:
let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
Swift le va verifica de la stânga la dreapta până când va găsi nil, moment în care se va opri.
Această simplă funcționalitate pe care o are Swift-ul face codul tău mai simplu si mai sigur, și iată totuși ce nume grandios de care mulți oameni se sperie. Păcat, pentru că acesta îți va face viața mai simplă dacă îți acorzi timp să îl înțelegi!
Ceea ce face este că te lasă să spui "folosește valoarea A dacă poți, dar dacă valoarea A este nil atunci folosește valoarea B." Asta este tot. Este folositoare în special pentru opționale, deoarece practic le face să nu mai fie opționale pentru că furnizezi o valoare B care nu este opțională. Deci, dacă A este opțională și are o valoare, aceasta este folosită (avem o valoare). Dacă A nu are nicio valoare, B este folosit (deci tot avem o valoare). În orice caz, sigur vom avea o valoare.
Pentru a îți oferi un context adevărat, încearcă să folosești acest cod într-un playground:
let album = albumReleased(year: 2006) ?? "unknown"
print("The album is \(album)")
Acele două semne de întrebare sunt de fapt operatorul de coalizare a valorii nule, iar în acest caz înseamnă "dacă albumReleased()
a returnat o valoare atunci pune-o în variabila album
, dar dacă albumReleased()
a returnal nil atunci folosește 'unknown' în schimb."
Dacă te uiți în panoul cu rezultate acum, vei vedea afișat "The album is Taylor Swift" – gata cu opționalele. Asta deoarece Swift acum poate fi sigur că va primi o valoare, fie pentru că funcția returnează o valoare sau pentru că tu îi furnizezi "unknown". Ceea ce înseamnă că nu trebuie să desfaci nimic sau să riști ca codul să crape – îți este garantat că ai date adevărate cu care poți lucra, iar asta face codul să fie mai sigur și mai ușor de folosit.
SPONSORED Take the pain out of configuring and testing your paywalls. RevenueCat's Paywalls allow you to remotely configure and A/B test your entire paywall UI without any code changes or app updates.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.