Opționale rapide? Nu uitați să dezvoltați!

Există o eroare de compilator care mă elimină de fiecare dată când o văd. Acesta ia forma,

„ClassName?” nu are un membru numit „memberName”

Acest lucru se poate întâmpla atunci când ați declarat o variabilă ca opțională, dar uitați să desfaceți acea opțională atunci când încercați să apelați o metodă pe ea.

De exemplu, având în vedere această definiție a clasei:

clasă Bird {var familie: șir var culoare: șir init (familie: șir, culoare: șir) {self.family = family self.color = color} func isSwift () – & gt; Bool {return self.family == „Apodidae”? adevărat: fals}}

init (familie: Șir, culoare: Șir) {

Întoarceți-vă singuri.familia == „Apodidae”? adevărat: fals

If , să zicem într-un ViewController, declar o variabilă pe care intenționez să o trimit la o instanță Bird opțională astfel:

Și apoi inițializez această variabilă mai târziu cu o instanță Bird, poate în viewDidLoad ():

birdInstance = Bird (familie: „Apodidae”, culoare: „Black”)

birdInstance = Bird (familie: „Apodidae”, culoare: „Black”)

Dacă încerc mai târziu să invoc metoda isSwift pe birdInstance, voi primi o eroare de compilator:

println (birdInstance.isSwift ())

println (birdInstance.isSwift ())

eroare: „Pasăre?” nu are un membru numit „isSwift”

Acest lucru poate părea destul de simplu – la urma urmei, am declarat birdInstance ca fiind opțional și știu că opționalele au nevoie de tratament special. Cum aș putea să fac această greșeală ?? Poate că aceasta este doar o consecință a stadiului meu actual din viață, încercând să codez în 15-30 de minute, cu bătrânul meu de 1 1/2 ani alergând, haha.

Cu toate acestea, ne ocupăm de acest lucru: este destul de ușor să scrieți ceva cod și să reveniți la el mai târziu și să nu vă amintiți cum ați declarat variabila dvs. într-o sesiune de codificare anterioară. Apoi, când vi se prezintă un mesaj care spune că clasa dvs. nu are un membru numit „___”, mergeți imediat la definiția clasei și vedeți funcția acolo, simplu ca ziua. Este ușor să petreci 3-5 minute zgâriindu-ți capul gândindu-te „Ce în lume ??!” … Și apoi îți dai seama – este acea declarație opțională pe care ai uitat să o gestionezi.

Pentru a remedia acest lucru, desigur, puteți face orice număr de lucruri, în funcție de situația dvs.

Forțează desfacerea opționalului și invocă metoda:

birdInstance! .isSwift () // Forțare desfăcută – ** ATENȚIE ** asigurați-vă că birdInstance este instanțiată înainte de a face acest lucru, sau veți primi o eroare de rulare

birdInstance! .isSwift () // Forțare desfăcută – ** ATENȚIE ** asigurați-vă că birdInstance este instanțiată înainte de a face acest lucru, sau veți primi o eroare de rulare

Utilizați înlănțuirea opțională și invocați metoda:

Declarați variabila ca implicit despachetată opțională, apoi invocați metoda ulterior fără exclamare sau semne de întrebare suplimentare:

var birdInstance: Bird! // Implicit despachetat – ** ATENȚIE ** asigurați-vă că birdInstance se instanțiază înainte de ao utiliza, sau veți primi o eroare de execuție birdInstance = Bird (familie: „Apodidae”, culoare: „Negru”) // O vreme mai târziu , invoca isSwift println (birdInstance.isSwift ())

var birdInstance: Bird! // Implicit despachetat – ** ATENȚIE ** asigurați-vă că birdInstance este instantaneat înainte de al utiliza, sau veți primi o eroare de execuție

birdInstance = Bird (familie: „Apodidae”, culoare: „Black”)

// Ceva timp mai târziu, invocați isSwift

println (birdInstance.isSwift ())

O postare pe blog a lui Peter Witham la CompileSwift a fost articolul care m-a determinat să mă gândesc: „OH! Nu am făcut nimic cu opționalul meu … asta este problema ”. Vă mulțumim, domnule, pentru postarea dvs.!

Publicat inițial la www.andrewcbancroft.com pe 26 iulie 2014.

Andrew Bancroft este autorul mai multor cursuri legate de iOS / Swift despre Pluralsight. El bloguează în mod regulat pe www.andrewcbancroft.com și www.dataday.life, este pasionat de învățare și descoperire și îi place să împărtășească noi perspective cu alții. Andrew transmite un tweet despre dezvoltarea de software și știința datelor ca @andrewcbancroft.