Брзе опције: Како их користити (са примерима)

У овом чланку ћете сазнати више о опционалном, његовим случајевима коришћења и опционом руковању у Свифту.

У претходном чланку смо сазнали о различитим типовима података доступним у Свифту, а такође смо приметили да променљива или константа декларисаних тих типова садржи подразумевану вредност.

Пример:

 нека сомеВалуе = Инт () исписује (сомеВалуе) 

Када покренете програм, излаз ће бити:

 0

Међутим, постоји још један тип података у Свифту који се зове Опционално, чија је подразумевана вредност нулл вредност ( nil). Опционално можете да користите када желите да променљива или константа не садрже вредност. Опционални тип може садржати вредност или одсуствовати вредност (нулл вредност).

Нетехнички, необавезно можете размишљати као о кутији за ципеле. Кутија за ципеле може садржати ципелу или не. Дакле, требали бисте знати унапред док приступате ципели из кутије.

Како се прогласити Необвезним?

Можете једноставно представља једну врсту података као опција додавањем !или ?до Type. Ако опција садржи вредност, она враћа вредност као Optional, ако не, враћа nil.

Пример 1: Како прогласити опцију у Свифту?

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

Када покренете програм, излаз ће бити:

 нил нил

У горњем програму иницијализовали смо опциони тип користећи ?и !. Оба начина важе за стварање опционог, али постоји једна главна разлика коју ћемо истражити у наставку.

Декларирање опционалног Инт значи да ће променљива или имати целобројну вредност или нема вредност. Будући да променљивој није додељена вредност, на екрану можете видети оба printизлаза израза nil.

Пример 2: Додељивање и приступ вредности из опционалног

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

Када покренете програм, излаз ће бити:

 Необвезно (5) 5 

У горе наведеном програму прогласили смо опцију Intтипа и у њему доделили вредност 5.

Као што видите, штампање опционалног као print(someValue)што вам не даје 5али Optional(5). Она је облика као што је описано горе: Optional. Да бисмо приступили са њега, потребан нам је механизам који се зове размотавање .

Необвезно можете отпаковати додавањем !знака на крају променљиве / константе као у следећем реду print(someValue!). print(someValue!)одмотава опционално и излазе 5на екрану.

Међутим, запамтите, овакав механизам за одмотавање треба користити само када сте сигурни да ће опционално имати вредност када му приступите.

Пример 3: Експлицитно проглашавање распакованог опционалним

Такође можете створити расмотани опционални као:

 let someValue:Int! = 5 print(someValue) 

Када покренете програм, излаз ће бити:

 5

У горенаведеном програму Int!креира неотпаковану опцију која аутоматски одмотава вредност док јој приступате тако да не морате сваки пут да додајете !знак.

Будите сигурни док користите ове врсте опција, променљива ће увек морати да има вредност када јој приступите. Ако то не учините, добићете фаталну грешку.

Пример 4: Фатална грешка при приступу нули распакованој опцији

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

Када покренете програм, добићете пад као фаталну грешку: неочекивано је пронађено нула док се распакује Необвезна вредност, јер код unwrappedValue:Int = someValueпокушава променљивој унсраппедВалуе доделити вредност из Опционалне неке вредности.

Међутим, сомевалуе је Optionalврста која садржи nilвредност. Покушај додељивања вредности нула променљивој унсраппедВалуе, која није опционална, довешће до пада.

Постоје различите технике за руковање овим случајем које су објашњене у наставку.

Необавезно руковање

Да би се користила вредност опционог, потребно га је распаковати. Бољи начин за коришћење опционалне вредности је условно одмотавање, а не присилно одмотавање помоћу !оператора.

То је зато што се условно одмотавање пита Провери да ли ова променљива има вредност? . Ако је одговор да, наведите вредност, иначе ће се носити са нултим случајем.

Напротив, присилно одмотавање каже да ова променљива има вредност док је користите . Због тога, када присилно одмотате променљиву која је нула, ваш програм ће бацити неочекивано пронађен нил док одмотава опционални изузетак и пада . Неке од техника за условно одмотавање објашњене су у наставку:

1. Ако-изјава

You can use if statement and compare optional with nil to find out whether a optional contains a value or not. You can use the comparison operator "equal to" operator (==) or the "not equal to" operator (!=) in the if statement.

Example 5: Optional handling with if else statement

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

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 an optional contain a value, otherwise the statement inside the else block executes. The major drawback of optional handling using this technique is, you still need to unwrap the value from optional using ! operator.

2. Optional Binding (if-let)

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

У горњем програму променљива сомеВалуе дефинисана је као необвезна и садржи нулту вредност. Оператор нултог удруживања не успе да одмота опционално, па враћа дефаултВалуе. Стога израз print(unwrappedValue)даје 5 у конзолу.

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

Када покренете програм, излаз ће бити:

 10

Међутим, у горе наведеном програму, опционална променљива сомеВалуе је иницијализована са вредношћу 10. Дакле, нил оператер удруживања успешно одмотава вредност од сомеВалуе. Према томе, израз someValue ?? defaultValueвраћа 10, а израз print(unwrappedValue)даје 10 у конзоли.

Занимљиви Чланци...