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 print
lausekelähdöt nil
nä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 Int
tyypin ja antaneet siihen arvon 5.
Kuten näette, tulostamalla valinnaiseksi print(someValue)
ei anna 5
vaan 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 5
nä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 = someValue
yrittää määrittää arvon valinnaisesta someValue-arvosta muuttujalle uncrappedValue.
Somevalue on kuitenkin Optional
tyyppi, joka sisältää nil
arvoa. 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 ?? defaultValue
palauttaa 10 ja lause print(unwrappedValue)
antaa 10 konsolissa.