Nopeat lisävarusteet: Kuinka niitä käytetään (esimerkkien kanssa)

Tässä artikkelissa opit valinnaisista, niiden käyttötapauksista ja valinnaisesta käsittelystä Swiftissä.

Edellisessä artikkelissa olemme oppineet erilaisista Swiftissä käytettävissä olevista tietotyypeistä ja huomasimme myös, että näiden tyyppien ilmoitettu muuttuja tai vakio sisältää oletusarvon.

Esimerkki:

 anna someValue = Int () tulostaa (someValue) 

Kun suoritat ohjelmaa, tulos on:

 0

Swiftissä on kuitenkin toinen tietotyyppi nimeltä Valinnainen, jonka oletusarvo on nolla-arvo ( nil). Voit käyttää valinnaista, kun haluat muuttujan tai vakion sisältävän siihen arvoa. Valinnainen tyyppi voi sisältää arvon tai puuttua arvosta (nolla-arvo).

Ei teknisesti, voit ajatella valinnaista kenkälaatikkona. Kenkälaatikossa voi olla kenkä tai ei. Joten sinun pitäisi tietää etukäteen päästäksesi kenkään laatikosta.

Kuinka julistaa valinnainen?

Voit edustaa Tietotyyppi valinnaisena liittämällä !tai ?sen Type. Jos valinnainen sisältää arvon, se palauttaa arvon Optional, ellei se palaa nil.

Esimerkki 1: Kuinka julistaa valinnainen Swiftissä?

 var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue) 

Kun suoritat ohjelmaa, tulos on:

 nolla nolla

Edellä olevassa ohjelmassa olemme alustaneet valinnaisen tyypin käyttämällä ?ja !. Molemmat tavat ovat kelvollisia luomaan valinnainen, mutta on yksi suuri ero, jota tutkimme alla.

Valinnaisen Int-arvon ilmoittaminen tarkoittaa, että muuttujalla on joko kokonaislukuarvo tai ei arvoa. Koska muuttujalle ei ole määritetty arvoa, näet molemmat printlausekelähdöt nilnäytöllä.

Esimerkki 2: Arvon määrittäminen ja käyttäminen valinnaisesta

 let someValue:Int? = 5 print(someValue) print(someValue!) 

Kun suoritat ohjelmaa, tulos on:

 Valinnainen (5) 5 

Yllä olevassa ohjelmassa olemme ilmoittaneet valinnaisen Inttyypin ja antaneet siihen arvon 5.

Kuten näette, tulostamalla valinnaiseksi print(someValue)ei anna 5vaan Optional(5). Se on muotoa, kuten edellä on kuvattu: Optional. Sieltä pääsemiseksi tarvitsemme mekanismin, jota kutsutaan purkamiseksi .

Voit purkaa valinnaisen lisäämällä !merkin muuttujan / vakion loppuun kuten seuraavalla rivillä print(someValue!). print(someValue!)purkaa valinnaiset ja ulostulot 5näytölle.

Muista kuitenkin, että tällaista purkamismekanismia tulisi käyttää vain, kun olet varma, että valinnaisella on varmasti arvo, kun käytät sitä.

Esimerkki 3: Selvittäminen pakkaamattomasta valinnaisesta

Voit myös luoda pakkaamattoman valinnaisen:

 let someValue:Int! = 5 print(someValue) 

Kun suoritat ohjelmaa, tulos on:

 5

Int!Luo yllä olevassa ohjelmassa käärimätön valinnainen, joka kumoaa arvon automaattisesti, kun sitä käytetään, jotta sinun ei tarvitse koskaan lisätä !merkkiä.

Ole varma, kun käytät tällaisia ​​vaihtoehtoja, muuttujalla on aina oltava arvo, kun käytät sitä. Jos et, saat vakavan virheen kaatumisen.

Esimerkki 4: Kohtalokas virhe käytettäessä tyhjää valinnaista

 var someValue:Int! var unwrappedValue:Int = someValue //crashes due to this line 

Kun suoritat ohjelmaa, saat kaatumisen kohtalokkaana virheenä: odottamaton löysi nollan purkamalla valinnaista arvoa, koska koodi unwrappedValue:Int = someValueyrittää määrittää arvon valinnaisesta someValue-arvosta muuttujalle uncrappedValue.

Somevalue on kuitenkin Optionaltyyppi, joka sisältää nilarvoa. Yritetään määrittää nolla-arvo muuttujalle uncrappedValue, joka ei ole valinnainen, johtaa kaatumiseen.

Tämän tapauksen käsittelemiseksi on erilaisia ​​tekniikoita, jotka selitetään alla.

Valinnainen käsittely

Voidakseen käyttää valinnaisen arvoa se on purettava. Parempi tapa käyttää valinnaista arvoa on ehdollinen purkaminen pikemminkin kuin pakottaminen käärimällä !operaattorin avulla.

Tämä johtuu siitä, että ehdollinen purkaminen kysyy Tarkista onko tällä muuttujalla arvo? . Jos kyllä, anna arvo, muuten se käsittelee nollatapauksen.

Päinvastoin, voiman purkaminen sanoo, että tällä muuttujalla on arvo, kun käytät sitä . Siksi, kun pakotat avaamaan muuttujan, joka on nolla, ohjelma heittää odottamattomasti löydetyn nollan purkamalla samalla valinnaisen poikkeuksen ja kaatumalla . Joitakin ehdollisen purkamisen tekniikoita selitetään alla:

1. If-lausunto

Voit käyttää if-lauseketta ja verrata valinnaista nollaan selvittääksesi, sisältääkö valinnainen arvon vai ei. Voit käyttää if-lauseessa vertailuoperaattoria "yhtä suuri" -operaattoria ( ==) tai "ei yhtä" -operaattoria ( !=).

Esimerkki 5: Valinnainen käsittely if else -lausekkeella

 var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil ( print("It has some value (someValue!)") ) else ( print("doesn't contain value") ) if someAnotherValue != nil ( print("It has some value (someAnotherValue!)") ) else ( print("doesn't contain value") ) 

Kun suoritat ohjelmaa, tulos on:

 ei sisällä arvoa Sillä on jokin arvo 0 

Yllä olevassa ohjelmassa if-lauseen sisällä oleva koodi suoritetaan, jos valinnainen sisältää arvon, muuten muun lohkon sisällä oleva käsky suoritetaan. Suurin haittapuoli valinnaisessa käsittelyssä tällä tekniikalla on, että sinun on silti purettava arvo valinnaisesta !operaattorin avulla.

2. Valinnainen sidonta (jos annetaan)

Optional binding helps you to find out whether an optional contains a value or not. If an optional contains a value, that value is available as a temporary constant or variable. Therefore, optional binding can be used with if statement to check for a value inside an optional, and to extract that value into a constant or variable in a single action.

Example 5: Optional handling using if let statement

 var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) if let temp = someAnotherValue ( print("It has some value (temp)") ) else ( print("doesn't contain value") ) 

When you run the program, the output will be:

 doesn't contain value It has some value 0 

In the above program, the code inside if statement executes if the optional contains a value. Otherwise the else block gets executed. The if-let statement also automatically unwraps the value and places the unwrapped value in temp constant. This technique has major advantage because you don't need to forcely unwrap the value although being certain an optional contains a value.

3. Guard statement

You can use guard to handle optionals in Swift. Don't worry if you don't know what guard is. For now, just think of guard as an if-else condition with no if block. If the condition fails, else statement is executed. If not, next statement is executed. See Swift guard for more details.

Example 6: Optional handling using guard-let

 func testFunction() ( let someValue:Int? = 5 guard let temp = someValue else ( return ) print("It has some value (temp)") ) testFunction() 

When you run the program, the output will be:

 It has some value 5

In the above program, the guard contains a condition whether an optional someValue contains a value or not. If it contains a value then guard-let statement automatically unwraps the value and places the unwrapped value in temp constant. Otherwise, else block gets executed and and it would return to the calling function. Since, the optional contains a value, print function is called.

4. Nil-coalescing operator

In Swift, you can also use nil-coalescing operator to check whether a optional contains a value or not. It is defined as (a ?? b). It unwraps an optional a and returns it if it contains a value, or returns a default value b if a is nil.

Example 7: Optional handling using nil-coalescing operator

 var someValue:Int! let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

When you run the program, the output will be:

 5

Yllä olevassa ohjelmassa muuttuja someValue on määritelty valinnaiseksi ja sisältää nolla-arvon. Nolla yhdistymisoperaattori ei pura valinnaista, joten se palauttaa oletusarvon. Siksi lauseke print(unwrappedValue)antaa 5 konsolissa.

 var someValue:Int? = 10 let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) 

Kun suoritat ohjelmaa, tulos on:

 10

Yllä olevassa ohjelmassa valinnainen muuttuja someValue kuitenkin alustetaan arvolla 10. Joten nolla yhdistävä operaattori purkaa arvon arvosta someValue. Siksi lauseke someValue ?? defaultValuepalauttaa 10 ja lause print(unwrappedValue)antaa 10 konsolissa.

Mielenkiintoisia artikkeleita...