Swift 101 - Delo z novimi Swift novimi vrednostmi

Programski jezik Swift ima novo funkcijo, imenovano opcijsko, ki prej ni bila na voljo v Objective-C. Podobne so neobveznim tipom v Javi in tipih, ki se lahko zamenjajo, v programskem jeziku C #.

Zakaj uporabljati opcijsko?

Morda razmišljate: "Ne morem ignorirati neobveznih elementov - to je funkcija, ki je ne bom nikoli uporabil", vendar vam priporočam, da preberete še naprej. Ugotovili boste, da morate uporabiti neobvezne elemente v programu Swift, če boste kdaj potrebovali vrednost nič.

Izbirne vrednosti v Swiftu omogočajo natančnejšo določitev kode tako, da vam omogočajo, da določite, kdaj je določena vrednost prazna (in če ni)! To vam pomaga izogniti se običajnim programskim napakam, do katerih pride v aplikaciji, ko naleti na nepričakovana ničelna vrednost.

Swiftove izbirne možnosti prav tako pomagajo, da koda vašega programa natančneje odseva zmožnost, ki jo že imate v osnovnih podatkih, da pokaže, da je atribut določene entitete neobvezen. Kot je prikazano na sliki 1, lahko podate vrsto atributa (v tem primeru niz) in navedete, ali je vrednost neobvezna.

Slika 1 - Podate lahko, da je atribut Core podatkovni entitet neobvezen.

Zdaj vam Swift omogoča, da naredite enako z vašimi lastnostmi in spremenljivkami. Tukaj je enakovredna opcijska deklaracija v Swift:

var middleName: String?

Ta izjava ustvari spremenljivko, imenovano middleName tipa String . Vprašaj ( ? ) Po vrsti spremenljivke String pomeni, da lahko spremenljivka middleName vsebuje vrednost, ki je lahko bodisi String ali nil . Vsakdo, ki gleda na to kodo, takoj ve, da je srednje ime lahko nič . To je samo-dokumentiranje!

Če ne podate začetne vrednosti za izbirno konstanto ali spremenljivko (kot je prikazano zgoraj), se vrednost za vas samodejno nastavi na ničlo . Če želite, lahko izrecno nastavite začetno vrednost na ničlo:

var middleName: String? = nil

Zdaj pa si poglejmo, kako se v Swiftu uporablja nič .

nič v Swiftu

Na prvi pogled morda ni očitno, vendar so lahko samo neobvezni ničli . Kot je navedeno v knjigi Apple Swift Programming Language (na voljo brezplačno v trgovini iBooks):

nil ni mogoče uporabiti z neobveznimi konstantami in spremenljivkami. Če mora biti konstanta ali spremenljivka v vaši kodi sposobna obvladovati odsotnost vrednosti pod določenimi pogoji, jo vedno razglasite kot neobvezno vrednost ustreznega tipa.

To pomeni, da ne morete narediti nekaj takega, ker spremenljivka firstName ni označena z vprašajem, ki označuje, da je neobvezna:

var firstName: String = nil

Ta koda izdela naslednjo časovno napako pri prevajanju:

Tip 'String' ne ustreza protokolu 'NilLiteralConvertible' .

Pomembno je tudi omeniti, da je nič v Swiftu drugačen od nič v Objective-C. V Objective-C je nil kazalec na neobstoječi objekt. V programu Swift nil preprosto označuje odsotnost vrednosti - ni kazalec. To pomeni, da lahko podate neobvezne vrste poljubne vrste, ne samo vrste objektov.

Dostop do neobveznih vrednosti

Za razliko od drugih programskih jezikov v Swiftu ne morete neposredno dostopati do izbirne vrednosti . Za dostop do osnovne vrednosti morate razmotati prvo možnost. Vzemite na primer naslednjo kodo:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: Niz

firstAndMiddleNames = firstName + "+ middleName

Prve tri vrstice kode razglasijo spremenljivko firstName String, spremenljivko middleName, ki je neobvezna String, in spremenljivko string AndMiddleNames String. Naslednja vrstica kode združuje (spreminja) vrednosti spremenljivk firstName in middleName skupaj s presledkom med njimi. Morda boste presenečeni, ko ugotovite, da ta vrstica kode generira naslednjo napako pri prevajanju:

Vrednost vrste možnosti »Niz?« niso razpakirane; si želel uporabiti "!" ali '?'?

To je eden od Swiftovih zaščitnih mehanizmov. Prisili vas, da potrdite, da je vrednost morda nič . Torej, kako odvijete izbirno? Obstajata dva glavna načina, kot je opisano v naslednjih poglavjih.

Uporaba prisilnega razklapljanja za neobvezne

Kot je nakazala napaka v prevajalniku v prejšnjem razdelku, je lahko en način, kako razmnožiti neobvezno vrednost, uporabiti klicaj (!) Za neobvezno, da ga izrecno razgrnemo. Na primer:

firstAndMiddleNames = firstName + " " + middleName!

To ročno prisili vrednost sredinskega imena, ki je neobvezna, da se odvije. Če pa med časom izvajanja middleName vsebuje nič, bo to povzročilo napako izvajalnega časa EXC_BAD_INSTRUCTION . Torej očitno ne želite uporabiti prisilnega razpakiranja, razen če ste popolnoma prepričani, da vrednost ni nič .

Uporaba neobveznega vezanja za odstranjevanje opcijskih opcij

Lahko uporabite tehniko, znano kot opcijska vezava, da preizkusite, ali neobvezna vsebuje vrednost, in če je tako, jo shranite v začasno spremenljivko ali konstanto. Če želite prikazati, kako to deluje z našim prejšnjim primerom, si oglejte to kodo:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: Niz

če pustite sredino = srednje ime

{

firstAndMiddleNames = firstName + "+ sredina

}

drugače

{

firstAndMiddleNames = firstName

}

Ko je pogoj if preverjen ob času izvajanja, če spremenljivka middleName vsebuje vrednost String, pogoj vrednoti v true, vrednost, vsebovana v spremenljivki middleName, je razpakirana, shranjena v srednji konstanti in koda znotraj kodiranih oklepajev if stavka se izvede.

Če spremenljivka middleName vsebuje nil, pogoj ocenjuje, da je false, neobvezna vrednost ni odpakirana, in koda v kodrastih oklepajih stavka else se izvede.

Implicitno nepovezani izbirni elementi

Swift ima tudi nekaj, kar se imenuje implicitno odvijete neobvezne. To so izbirni elementi, ki jih ni treba odpreti z uporabo prisilnega razpakiranja (!) Ali neobvezne vezave, ker se implicitno odvijejo (samodejno). Razglašajo se s klicajem (!) In ne z vprašajem (?).

Pogosto vidite implicitno neobrtane izbirne elemente pri delu z vmesniki Builder Interface (lastnosti IBOutlet ). Na primer:

@IBOutlet weak var lblDescription: UILabel!

V tej kodi ima lastnost vtičnika lblDescription za njim klicaj, kar pomeni, da je implicitno razpakirana. To vam omogoča dostop do nepremičnine, ne da bi jo razpakirali.

V tem primeru lastnost vtičnice zagotovo ne vsebuje sklica na oznako, ampak mora biti . Če ne vsebuje sklica na oznako, pomeni, da je povezava med vtičnico in nalepko prekinjena. V tem primeru je v redu, če imate napako med izvajanjem, ker želite vedeti, da je povezava prekinjena, da jo lahko popravite!

Očitno je, da v primerih, ko niste 100-odstotno prepričani, da konstanta ali spremenljivka vsebuje vrednost, namesto tega uporabite običajno opcijo.

Zaključek

Neobvezni so odlična nova funkcija programa Swift, ki vam omogoča varno ravnanje z ničelnimi vrednostmi v aplikacijah za iOS. Priporočamo, da nekajkrat pregledate to objavo, da se prepričate, da razumete osnovne koncepte, nato pa se vrnite v knjigo Apple Swift Programming Language, če želite izvedeti več o tem, kako se v Swiftu uporabljajo izbirni elementi.