Швидкі додаткові засоби: як ними користуватися (із прикладами)

У цій статті ви дізнаєтеся про необов’язкові, випадки використання та необов’язкові обробки в Swift.

У попередній статті ми дізналися про різні типи даних, доступні в Swift, а також помітили, що змінна або константа, оголошені цими типами, містять значення за замовчуванням.

Приклад:

 let someValue = Int () print (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значення. Спроба присвоїти значення 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. Оператор злиття 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 у консоль.

Цікаві статті...