Brzi izbornici: Kako ih koristiti (s primjerima)

U ovom ćete članku naučiti o opcijskom, njegovim slučajevima korištenja i neobaveznom rukovanju u Swiftu.

U prethodnom članku saznali smo o različitim vrstama podataka dostupnim u Swiftu, a primijetili smo i da varijabla ili konstanta deklariranih tih tipova sadrži zadanu vrijednost.

Primjer:

 neka someValue = Int () ispis (someValue) 

Kada pokrenete program, izlaz će biti:

 0

Međutim, postoji još jedan tip podataka u Swiftu koji se naziva Neobavezno, čija je zadana vrijednost null vrijednost ( nil). Neobvezno možete koristiti kada želite da varijabla ili konstanta ne sadrže vrijednost. Izborni tip može sadržavati vrijednost ili je odsutnost (null vrijednost).

Netehnički, neobavezno možete razmišljati kao o kutiji za cipele. Kutija za cipele može sadržavati cipelu ili ne. Dakle, trebali biste znati unaprijed dok pristupate cipeli iz kutije.

Kako proglasiti Neobveznim?

Možete jednostavno predstavlja tip podataka kao izborni dodavanjem !ili ?na Type. Ako opcija sadrži vrijednost, ona vraća vrijednost kao Optional, ako ne, vraća nil.

Primjer 1: Kako proglasiti neobavezno u Swiftu?

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

Kada pokrenete program, izlaz će biti:

 nula nula

U gore navedenom programu inicijalizirali smo neobavezni tip pomoću ?i !. Oba su načina valjana za stvaranje neobaveznog, ali postoji jedna glavna razlika koju ćemo istražiti u nastavku.

Deklariranje neobaveznog Int znači da će varijabla ili imati cijelu vrijednost ili neće imati vrijednost. Budući da varijabli nije dodijeljena vrijednost, na zaslonu možete vidjeti oba printizlaza izraza nil.

Primjer 2: Dodjela i pristup vrijednosti iz izbornog

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

Kada pokrenete program, izlaz će biti:

 Izborno (5) 5 

U gore navedenom programu proglasili smo opciju Inttipa i u nju dodijelili vrijednost 5.

Kao što vidite, ispis opcionalnog kao print(someValue)ne daje vam, 5ali Optional(5). To je u obliku kao što je opisano gore: Optional. Da bismo pristupili iz njega, potreban nam je mehanizam koji se naziva razmotavanje .

Neobavezno možete otpakirati dodavanjem !znaka na kraju varijable / konstante kao u sljedećem retku print(someValue!). print(someValue!)odmotava opcionalno i izlaze 5na zaslonu.

Međutim, ne zaboravite, ovakav mehanizam za razmotavanje treba koristiti samo kada ste sigurni da će neobavezna vrijednost imati vrijednost kad joj pristupite.

Primjer 3: Eksplicitno proglašavanje rasmotanog neobaveznim

Također možete stvoriti rasmotani opcijski kao:

 let someValue:Int! = 5 print(someValue) 

Kada pokrenete program, izlaz će biti:

 5

U gore navedenom programu Int!kreira neotpakiranu opciju koja automatski odmotava vrijednost dok joj pristupate tako da ne morate svaki put dodati !znak.

Budite sigurni dok koristite ove vrste opcija, varijabla će uvijek trebati imati vrijednost kada joj pristupite. Ako to ne učinite, dobit ćete fatalnu pogrešku.

Primjer 4: Kobna pogreška pri pristupu nuli nerazmotanoj opciji

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

Kada pokrenete program, dobit ćete pad kao fatalnu pogrešku: neočekivano je pronađeno nula tijekom odmotavanja neobavezne vrijednosti jer kôd unwrappedValue:Int = someValuepokušava dodijeliti vrijednost iz opcionalne someValue varijabli unsrappedValue.

Međutim, somevalue je Optionalvrsta koja sadrži nilvrijednost. Pokušaj dodjeljivanja vrijednosti nula varijabli unsrappedValue koja nije neobavezna će dovesti do pada.

Postoje različite tehnike za rješavanje ovog slučaja koje su objašnjene u nastavku.

Neobavezno rukovanje

Da bi se upotrijebila vrijednost neobveznog, potrebno ga je razmotati. Bolji način upotrebe neobavezne vrijednosti je uvjetno odmotavanje, a ne prisilno odmotavanje pomoću !operatora.

To je zato što se uvjetno odmatanjem pita Provjeri ima li ova varijabla vrijednost? . Ako je odgovor da, navedite vrijednost, inače će se riješiti nula slučaja.

Naprotiv, prisilno odmotavanje kaže da ova varijabla ima vrijednost dok je koristite . Stoga, kada prisilno odmotate varijablu koja je nula, vaš će program baciti neočekivano pronađeni nil tijekom odmotavanja neobavezne iznimke i rušenja . Neke od tehnika za uvjetno odmotavanje objasnjene su u nastavku:

1. Ako-izjava

Možete koristiti izraz if i usporediti opcionalno s nil da biste saznali sadrži li neobavezna vrijednost vrijednost ili ne. Možete koristiti operator usporedbe "jednak" operatoru ( ==) ili operator "nije jednak" ( !=) u naredbi if.

Primjer 5: Neobvezno rukovanje izjavom 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") ) 

Kada pokrenete program, izlaz će biti:

 ne sadrži vrijednost Ima neku vrijednost 0 

U gornjem programu, kôd unutar naredbe if izvršava se ako neobavezno sadrži vrijednost, inače se izvršava naredba unutar bloka else. Glavni nedostatak neobaveznog rukovanja ovom tehnikom je da i dalje trebate otpakirati vrijednost iz opcijskog !operatora koji koristi .

2. Izborno vezanje (ako je dopušteno)

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

U gore navedenom programu varijabla someValue definirana je kao neobvezna i sadrži nultu vrijednost. Operator nultog udruživanja ne uspijeva razmotati opcionalno, stoga vraća defaultValue. Stoga izjava print(unwrappedValue)izlazi 5 u konzolu.

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

Kada pokrenete program, izlaz će biti:

 10

Međutim, u gore navedenom programu, neobavezna varijabla someValue inicijalizira se s vrijednošću 10. Dakle, nil operater spajanja uspješno odmotava vrijednost iz someValue. Stoga izraz someValue ?? defaultValuevraća 10, a izraz print(unwrappedValue)izlazi 10 u konzoli.

Zanimljivi članci...