Необов’язковим є або встановлений, або не встановлений (не нульовий або нульовий) ... залишаючи перед нами важливе рішення. "Як нам писати наш код, щоб він міг працювати коректно для обох станів?". Спосіб розгортання необов’язкового - це те, що вирішує нас.
Існує кілька підходів, якими можна протистояти невстановленому необов’язковому.
- Крах!
- Значення за замовчуванням для чогось - якщо воно не встановлене.
- Витончено не вдається, тобто нічого не робити, але також якщо значення було встановлено, то присвойте його.
- Витончено не вдається, тобто нічого не робити, проте якщо значення було встановлено ... зробіть щось (це просто більше, ніж одне призначення).
Нижче наведено 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
}