Swift 101 - Työskentely Swiftin uusien valinnaisarvojen kanssa

Swift-ohjelmointikielellä on uusi ominaisuus, jota kutsutaan lisävarusteiksi, joita ei aiemmin ollut käytettävissä Objective-C: ssä. Ne ovat samanlaisia ​​kuin valinnaiset tyypit Java- ja nullable-tyypit C # -ohjelmointikielellä.

Miksi käyttää valinnaisia?

Saatat ajatella "voin ohittaa valinnaiset - se on ominaisuus, jota en koskaan käytä", mutta suosittelen, että luet enemmän. Tulet huomaamaan, että sinun täytyy käyttää vaihtoehtoja Swiftissä, jos tarvitset arvoa nollaan!

Swiftin valinnaiset arvot sallivat sinun olla tarkempia koodissasi antamalla sinulle mahdollisuuden määrittää, milloin tietty arvo on tyhjä (ja kun se ei ole!) Näin voit välttää sovelluksessa esiintyvät yleiset ohjelmointivirheet, kun se kohtaa odottamaton nolla-arvo.

Swiftin optio-ohjelmat auttavat myös sovelluksen koodissa, että se heijastaa tarkemmin sitä, mitä sinulla on jo Core Data -toiminnossa. Kuten kuvassa 1 on esitetty, voit määrittää attribuutin tyypin (tässä tapauksessa merkkijono) sekä ilmoittaa, onko arvo valinnainen.

Kuva 1 - Voit määrittää, että Core Data -ominaisuus on valinnainen.

Nyt Swift voit tehdä saman omien ominaisuuksien ja muuttujien kanssa. Tässä on vastaava valinnainen ilmoitus Swiftissä:

var middleName: String?

Tämä ilmoitus luo muuttujan nimeltä Nimeä tyyppi String . Merkkimuuttujatyypin jälkeen kysymysmerkki ( ? ) Osoittaa, että middleName- muuttuja voi sisältää arvon, joka voi olla joko merkkijono tai nolla . Jokainen, joka tarkastelee tätä koodia, tietää heti, että MiddleName voi olla nolla . Se on itse dokumentointi!

Jos et määritä valinnaisen vakion tai muuttujan alkuarvoa (kuten edellä on esitetty), arvo asetetaan automaattisesti nollaan . Jos haluat, voit määrittää alkuarvon nimenomaan nollaan:

var middleName: String? = nil

Tarkastellaan nyt lähemmin, miten Swiftissä käytetään nollaa .

nolla Swiftissä

Se ei ehkä ole ilmeinen ensi silmäyksellä, mutta vain valinnaiset vaihtoehdot voivat olla nolla . Kuten Applen Swift-ohjelmointikielikirjassa (saatavilla ilmaiseksi iBooks-kaupassa):

ei voi käyttää ei-valinnaisia ​​vakioita ja muuttujia. Jos koodisi vakion tai muuttujan on pystyttävä selviytymään arvon puuttumisesta tietyissä olosuhteissa, ilmoittakaa se aina sopivan tyypin valinnaiseksi arvoksi.

Tämä tarkoittaa, että et voi tehdä jotain tällaista, koska ensimmäisen nimen muuttujaa ei ole merkitty kysymysmerkillä, joka ilmaisee, että se on valinnainen:

var firstName: String = nil

Tämä koodi tuottaa seuraavan kääntymisajan virheen:

Tyyppi 'Merkkijono' ei ole protokollan NilLiteralConvertible mukainen .

On myös tärkeää huomata, että Swiftin nolla on eri kuin nollassa Objective-C: ssä. Objective-C: ssä nolla on ei-olemassa olevan objektin osoitin. Swiftissä nolla ilmaisee vain arvon puuttumisen - se ei ole osoitin. Tämä tarkoittaa, että voit määrittää minkä tahansa tyyppisiä lisävarusteita, ei vain objektityyppejä.

Valinnaisarvojen käyttäminen

Toisin kuin muut ohjelmointikielet, Swiftissa et voi käyttää valinnaista arvoa suoraan . Sinun täytyy avata valinnainen ensin, jotta pääset sen taustalla olevaan arvoon. Ota esimerkiksi seuraava koodi:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

Kolme ensimmäistä riviä ilmoittavat ensimmäisenNimi- merkkijonon muuttujan, MiddleName- valinnaisen String-muuttujan ja firstAndMiddleNames- merkkijonon muuttujan. Seuraava koodirivi yhdistää (yhdistää) ensimmäisen nimen ja keskinimen muuttujan arvot niiden välissä olevan tilan kanssa. Saatat olla yllättynyt siitä, että tämä koodirivi luo seuraavan kääntymisajan virheen:

Vaihtoehdon tyypin 'String?' Arvo ei pakattu; tarkoititko käyttää "!" tai '?'?

Tämä on yksi Swiftin suojamekanismeista. Se pakottaa sinut vahvistamaan, että arvo voi olla nolla . Joten, miten avaat valinnaisen? Seuraavissa osissa kuvataan kaksi pääasiallista tapaa.

Pakotettujen pakkausten purkaminen valinnaisille

Kuten edellisen osion kääntäjävirhe ehdotti, yksi tapa purkaa valinnainen arvo on käyttää huutomerkkiä (!) Sen jälkeen, kun se on vapaaehtoisesti pakattu purkamaan. Esimerkiksi:

firstAndMiddleNames = firstName + " " + middleName!

Tämä pakottaa manuaalisesti, että keskimmäisen nimen arvo on pakattu . Jos MiddleName sisältää kuitenkin nollan suorituksen aikana, tämä tuottaa EXC_BAD_INSTRUCTION- ajoajan virheen. Joten et selvästikään halua käyttää pakottavaa purkamista, ellet ole täysin varma siitä, että arvo ei ole nolla .

Valinnaisen sitomisen käyttäminen valinnaisvarusteiden purkamiseen

Voit käyttää tekniikkaa, jota kutsutaan valinnaiseksi sitomiseksi, jos haluat testata, sisältääkö valinnainen arvo arvoa, ja jos näin on, tallenna tämä arvo tilapäiseen muuttujaan tai vakioon. Voit näyttää tämän koodin seuraavasti:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

jos päästät keskelle = middleName

{

firstAndMiddleNames = firstName + "" + keskellä

}

muu

{

firstAndMiddleNames = firstName

}

Kun if- ehto tarkistetaan ajoaikana, jos MiddleName- muuttuja sisältää merkkijonon arvon, ehto arvioi totta, MiddleName- muuttujaan sisältyvä arvo on pakattu, tallennettu keskivakioon ja koodiin jos lauseke suoritetaan.

Jos MiddleName- muuttuja sisältää nollaa, ehto arvioidaan falseiksi, valinnainen arvo ei ole pakattu, ja toisen lausekkeen kierteisissä olkaimissa oleva koodi suoritetaan.

Implicitly Unwrapped Optionals

Swiftillä on myös jotain, jota kutsutaan implisiittisesti pakkaamattomiksi lisävarusteiksi. Nämä ovat valinnaisia ​​vaihtoehtoja, joita ei tarvitse purkaa käyttämällä pakotettua purkamista (!) Tai valinnaista sitomista, koska ne on pakattu epäsuorasti (automaattisesti). Ne ilmoitetaan käyttämällä huutomerkkiä (!) Kyselymerkin (?) Sijasta.

Näet usein epäsuorasti pakattuja lisävarusteita, kun käytät Interface Builder -liitäntöjä ( IBOutlet- ominaisuudet). Esimerkiksi:

@IBOutlet weak var lblDescription: UILabel!

Tässä koodissa lblDescription outlet -ominaisuudella on huutomerkki sen jälkeen, mikä osoittaa, että se on implisiittisesti pakattu. Näin voit käyttää omaisuutta ilman sen pakkaamista.

Tässä esimerkissä pistorasiaan ei ole taattu viittausta tarraan, mutta sen pitäisi ehdottomasti olla . Jos se ei sisällä viittausta tarraan, se tarkoittaa, että liitännän ja etiketin välinen yhteys on rikki. Tällöin on OK, jos sinulla on ajoitusvirhe, koska haluat tietää, että yhteys on rikki, jotta voit korjata sen!

Ilmeisesti tapauksissa, joissa et ole 100% varma siitä, että vakio tai muuttuja sisältää arvon, sinun pitäisi käyttää tavallista valinnaisia.

johtopäätös

Valinnaiset ovat Swiftin uusi uusi ominaisuus, jonka avulla voit turvallisesti käsitellä nolla- arvoja iOS-sovelluksissa. Suosittelen, että tarkastelet tätä viestiä muutaman kerran varmistaaksesi, että ymmärrät perusajatukset, ja palaa sitten Applen Swift-ohjelmointikielikirjaan saadaksesi lisätietoja siitä, miten vaihtoehtoja käytetään Swiftissä.