Бързи опции: Как да ги използвате (с примери)

В тази статия ще научите за незадължително, неговите случаи на употреба и незадължително боравене в Swift.

В предишната статия научихме за различните типове данни, налични в Swift, и също така забелязахме, че променливата или константата, декларирани от тези типове, съдържат стойност по подразбиране.

Пример:

 нека someValue = Int () отпечатва (someValue) 

Когато стартирате програмата, изходът ще бъде:

 0

В Swift обаче има друг тип данни, наречен Незадължителен, чиято стойност по подразбиране е нулева стойност ( nil). Можете да използвате по избор, когато искате променлива или константа да не съдържа стойност в нея. Незадължителен тип може да съдържа стойност или да липсва стойност (нулева стойност).

Нетехнически, можете да мислите по избор като кутия за обувки. Кутията за обувки може да съдържа или не обувка в нея. Така че, трябва да знаете предварително, докато отваряте обувката от кутията.

Как да декларирам Незадължителен?

Можете просто да представите тип данни като Незадължителен, като добавите !или ?към Type. Ако опция съдържа стойност в нея, тя връща стойност Optional, ако не, тя се връща nil.

Пример 1: Как да декларирам незадължителен в Swift?

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

Когато стартирате програмата, изходът ще бъде:

 нула нула

В горната програма инициализирахме незадължителен тип, използвайки ?и !. И двата начина са валидни за създаване на незадължителен, но има една основна разлика, която ще разгледаме по-долу.

Декларирането на незадължителен Int означава, че променливата ще има цяло число или няма стойност. Тъй като на променливата не е присвоена стойност, можете да видите и двата 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опитва да присвои стойност от незадължителна someValue на променлива unsrappedValue.

Somevalue обаче е Optionalтип, който съдържа nilстойност. Опитът да присвоите нулева стойност на променливата unsrappedValue, която не е задължителна, ще доведе до срив.

Има различни техники за справяне с този случай, които са обяснени по-долу.

Незадължително боравене

За да се използва стойност на незадължителен елемент, той трябва да бъде разгънат. По-добрият начин за използване на незадължителна стойност е чрез условно разгъване, вместо принудително разгъване с помощта на !оператор.

Това е така, защото условно разгъване се пита Проверете дали тази променлива има стойност? . Ако да, дайте стойността, в противен случай тя ще се справи с нула.

Напротив, при принудителното разгъване се казва, че тази променлива има стойност, докато я използвате . Следователно, когато принудите да разгънете променлива, която е нула, вашата програма ще хвърли неочаквано намерена нула, докато разгъне незадължително изключение и ще се срине . Някои от техниките за условно разгъване са обяснени по-долу:

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

В горната програма променливата someValue е дефинирана по избор и съдържа нулева стойност. Операторът за коалиране nil не успява да разгъне опцията, поради което връща defaultValue. Следователно изразът print(unwrappedValue)извежда 5 в конзолата.

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

Когато стартирате програмата, изходът ще бъде:

 10

Обаче в горната програма незадължителната променлива someValue се инициализира със стойност 10. И така, операторът на коалиране nil успешно разгъва стойността от someValue. Следователно операторът someValue ?? defaultValueвръща 10 и изразът print(unwrappedValue)извежда 10 в конзолата.

Интересни статии...