Необов’язковим є або встановлений, або не встановлений (не нульовий або нульовий) ... залишаючи перед нами важливе рішення. "Як нам писати наш код, щоб він міг працювати коректно для обох станів?". Спосіб розгортання необов’язкового - це те, що вирішує нас.
Існує кілька підходів, якими можна протистояти невстановленому необов’язковому.
- Крах!
- Значення за замовчуванням для чогось - якщо воно не встановлене.
- Витончено не вдається, тобто нічого не робити, але також якщо значення було встановлено, то присвойте його.
- Витончено не вдається, тобто нічого не робити, проте якщо значення було встановлено ... зробіть щось (це просто більше, ніж одне призначення).
Нижче наведено 4 підходи
Використання примусового розгортання призведе до збою, якщо у вас немає значення. Ви хотіли б зробити це, якщо наявність цієї цінності є життєво важливим, наприклад, назва фільму (кожен фільм ПОВИНЕН мати назву). !використовується для примусового розгортання.
movieTitle = movie.title!
Використання коагуляції nil - це ще один спосіб, який надасть вам більше контролю , тобто він не збій, якщо значення не встановлено, і не буде "нічого не встановлювати", якщо його не встановити ... він буде робити те, що ви йому скажете це зробити, наприклад, за замовчуванням / встановить назву фільму на untitled_movie, якщо не буде встановлено ім'я. ??використовується для злиття нулів.
var movieTitle = movie.title ?? "untitled_Movie"
Використання необов’язкового Chaining нічого не дасть, якщо у вас немає значення, і встановить значення, якщо у вас є значення. Ви робите це для того, що встановлення його значення не має життєво важливого значення, наприклад, для імені агента вашого актора . ?використовується для додаткового ланцюжка.
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
Використання if-let(або guardдва різні типи необов’язкового прив’язки ) надасть вам більше контролю , і воно не вийде з ладу, якщо значення не встановлено. Якщо значення встановлено, ви можете щось зробити. Якщо це не встановлено, ви можете додати elseзаяву.
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
Це найбільш часто використовуваний спосіб розгортання, оскільки примусове розгортання дещо не рекомендується. Докладніше про те, чому це не рекомендується, дивіться тут . Для гарного порівняння між guardі if-letдивguard vs. if-let
Примітка:
Необов’язкові прив’язки та додаткові ланцюжки зазвичай використовуються разом:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}