Greiti pasirinkimai: kaip juos naudoti (su pavyzdžiais)

Šiame straipsnyje sužinosite apie neprivalomus, jų naudojimo atvejus ir pasirenkamą tvarkymą „Swift“.

Ankstesniame straipsnyje mes sužinojome apie skirtingus duomenų tipus, esančius „Swift“, taip pat pastebėjome, kad tų tipų deklaruojamame kintamajame ar pastoviame yra numatytoji vertė.

Pavyzdys:

 tegul spausdina someValue = Int () (someValue) 

Kai paleisite programą, išvestis bus:

 0

Tačiau „Swift“ yra dar vienas duomenų tipas, vadinamas „Pasirenkama“, kurio numatytoji vertė yra nulinė reikšmė ( nil). Galite naudoti neprivalomą, kai norite, kad kintamasis ar konstantos reikšmė jame nebūtų. Pasirenkamame tipe gali būti vertė arba jos nėra (vertė yra nulinė).

Netechniškai galite galvoti kaip apie batų dėžę. Batų dėžėje bato gali būti, o jo gali nebūti. Taigi, jūs turėtumėte žinoti iš anksto, prieidami prie bato iš dėžutės.

Kaip paskelbti neprivalomą?

Jūs galite tiesiog atstovauti duomenų tipas, kaip Nebūtina pridėdami !arba ?į Type. Jei pasirinktinėje yra reikšmė, ji grąžina vertę Optional, jei ne nil.

1 pavyzdys: Kaip paskelbti neprivalomą programoje „Swift“?

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

Kai paleisite programą, išvestis bus:

 nulis nulis

Pirmiau pateiktoje programoje mes inicijavome pasirinktinį tipą naudodami ?ir !. Abu būdai yra tinkami sukurti neprivalomą, tačiau yra vienas pagrindinis skirtumas, kurį mes išnagrinėsime toliau.

Deklaravus neprivalomą Int reiškia, kad kintamasis turės sveiką skaičių arba neturės vertės. Kadangi kintamajam nepriskiriama jokia vertė, ekrane galite pamatyti abu printteiginių išvestis nil.

2 pavyzdys: reikšmės priskyrimas ir prieiga iš pasirinktinai

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

Kai paleisite programą, išvestis bus:

 Neprivaloma (5) 5 

Pirmiau pateiktoje programoje mes paskelbėme, kad Inttipas yra neprivalomas ir jame priskirta 5 vertė.

Kaip matote, spausdinimo neprivaloma print(someValue)nesuteikia jums 5, bet Optional(5). Ji yra pavidalo, kaip aprašyta aukščiau: Optional. Norint pasiekti iš jo, mums reikia mechanizmo, vadinamo išvyniojimu .

Galite išvynioti pasirinktinį, pridedant !simbolį kintamojo / konstantos pabaigoje, kaip kitoje eilutėje print(someValue!). print(someValue!)ekrane išvynioja pasirenkamą ir išvestį 5.

Tačiau nepamirškite, kad tokio tipo išvyniojimo mechanizmas turėtų būti naudojamas tik tada, kai esate tikri, kad pasirinktinė vertė turės prieigą prie jo.

3 pavyzdys: Aiškiai paskelbiama neišvyniota kaip neprivaloma

Taip pat galite sukurti neišvyniotą pasirinktinį kaip:

 let someValue:Int! = 5 print(someValue) 

Kai paleisite programą, išvestis bus:

 5

Pirmiau minėtoje programoje Int!sukuriate neišvyniotą pasirinktinį, kuris automatiškai išvynioja vertę, kai jūs ją pasiekiate, kad nereikėtų kaskart pridėti !simbolio.

Būkite tikri, kai naudojate tokio tipo pasirinktis, kintamasis visada turės turėti vertę, kai jį pasiekiate. Jei to nepadarysite, gausite mirtiną klaidos avariją.

4 pavyzdys: mirtina klaida pasiekiant nulį išvyniotą pasirinktinį

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

Paleidę programą gausite avariją kaip lemtingą klaidą: netikėtai radote nulį, kai išvyniojote Pasirenkamą vertę, nes kodas unwrappedValue:Int = someValuebando priskirti reikšmę iš Pasirenkama someValue kintamajam neišpakuotamValue.

Tačiau somevalue yra Optionaltipas, kuriame yra nilvertė. Bandant priskirti nulinę reikšmę kintamajam „unsrappedValue“, kuris nėra pasirenkamas, bus įvykusi avarija.

Yra įvairių būdų, kaip elgtis šioje byloje, kurie paaiškinti toliau.

Pasirenkamas tvarkymas

Norint naudoti pasirinktinio vertę, ją reikia išvynioti. Geresnis būdas naudoti pasirinktinę vertę yra sąlyginis išvyniojimas, o ne priverstinis išvyniojimas naudojant !operatorių.

Taip yra todėl, kad sąlygiškai išvyniojus klausiama Patikrinti, ar šis kintamasis turi vertę? . Jei taip, nurodykite vertę, kitaip ji sutvarkys nulinį atvejį.

Priešingai, jėgos išvyniojimas sako, kad šis kintamasis turi vertę, kol jūs jį naudojate . Todėl priverčiant išvynioti kintamąjį, kuris yra nulis, programa išmes netikėtai rastą nulį, o išvynios pasirinktinę išimtį ir užstrigs . Kai kurie sąlyginio išvyniojimo būdai paaiškinti toliau:

1. Jei-teiginys

Norėdami sužinoti, ar pasirinktinėje yra reikšmė, ar ne, galite naudoti „if“ teiginį ir palyginti pasirinktinai su „nulis“. „If“ sakinyje galite naudoti palyginimo operatorių „lygu“ operatoriui ( ==) arba operatorių „ne ​​lygu“ ( !=).

5 pavyzdys: Neprivalomas tvarkymas su teiginiu if else

 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") ) 

Kai paleisite programą, išvestis bus:

 nėra vertės. Ji turi tam tikrą reikšmę 0 

Ankstesnėje programoje „if“ teiginio kodas vykdomas, jei pasirinktinai yra reikšmė, kitaip vykdomas sakinys, esantis kitame bloke. Pagrindinis pasirinktinio tvarkymo naudojant šią techniką trūkumas yra tas, kad vis tiek turite išvynioti vertę iš pasirinktinio, naudodamiesi !operatoriumi.

2. Neprivalomas įrišimas (jei leidžiama)

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

Pirmiau pateiktoje programoje kintamasis someValue yra apibrėžtas kaip neprivalomas ir jame nėra vertės. Nulis sujungimo operatorius nesugeba išvynioti pasirinktinio, todėl pateikia „defaultValue“. Todėl teiginys print(unwrappedValue)konsolėje pateikia 5 rezultatus.

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

Kai paleisite programą, išvestis bus:

 10

Tačiau pirmiau minėtoje programoje pasirenkamas kintamasis someValue inicijuojamas verte 10. Taigi nulinis sujungimo operatorius sėkmingai išvynioja vertę iš someValue. Todėl teiginys konsolėje someValue ?? defaultValuegrąžina 10, o teiginys - print(unwrappedValue)10.

Įdomios straipsniai...