Перш ніж я можу описати випадки використання необов’язково необов’язаних необов’язкових, ви вже повинні зрозуміти, що таке опціональні та нечітко розгорнуті необов'язкові додатки у Swift. Якщо ви цього не зробите, рекомендую спершу прочитати мою статтю за факультативом
Коли використовувати необов’язково розмотану необов’язково
Є дві основні причини, з яких можна створити неявно необов’язану необов’язковість. Все це стосується визначення змінної, до якої ніколи не буде доступно, nil
оскільки в іншому випадку компілятор Swift завжди змусить вас явно відкрутити необов'язковий.
1. Константа, яку неможливо визначити під час ініціалізації
Кожна константа члена повинна мати значення до моменту завершення ініціалізації. Іноді константа не може бути ініціалізована з її правильним значенням під час ініціалізації, але все одно можна гарантувати, що вона матиме значення, перш ніж отримати доступ.
Використання необов'язкової змінної вирішує цю проблему, оскільки необов'язковий автоматично ініціалізується, nil
і значення, яке воно в кінцевому підсумку міститиме, все ще буде незмінним. Однак може бути болем постійно розгортати змінну, яку ви точно знаєте, це не нуль. Неявно розгорнуті необов’язкові домагаються тих же переваг, що й Факультативні, з додатковою перевагою, яку не потрібно явно розгортати скрізь.
Чудовим прикладом цього є те, коли змінна члена не може бути ініціалізована в підкласі UIView, поки подання не завантажується:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
Тут ви не можете обчислити початкову ширину кнопки до тих пір, поки подання не завантажиться, але ви знаєте, що awakeFromNib
буде викликано раніше, ніж будь-який інший метод перегляду (крім ініціалізації). Замість того, щоб змусити ціль явно розкручувати значення по всьому класу, ви можете оголосити його як необов’язкове розгорнуте необов’язкове.
2. Коли ваша програма не може відновитися від змінної істоти nil
Це має бути вкрай рідкісним, але якщо ваша програма не може продовжувати працювати, якщо доступ до змінної є nil
, то марно витрачати час на тестування її nil
. Як правило, якщо у вас є умова, яка повинна бути абсолютно вірною, щоб ваш додаток продовжував працювати, ви б використовували assert
. Неявно розкручений необов’язковий має утвердження для нуля, вбудованого прямо в нього. Навіть тоді часто буває добре розгортати необов'язковий і використовувати більш описовий аргумент, якщо він дорівнює нулю.
Коли не використовувати необов’язково розмотану необов’язково
1. Ліниво обчислені змінні учасника
Іноді у вас є змінна елемента, яка ніколи не повинна бути нульовою, але вона не може бути встановлена на правильне значення під час ініціалізації. Одним із варіантів є використання непримітно розгорнутого факультативу, але кращим способом є використання ледачої змінної:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Тепер змінна члена contents
не ініціалізується до першого доступу до неї. Це дає класу можливість перейти у правильний стан перед обчисленням початкового значення.
Примітка. Це може здатися суперечливим №1 зверху. Однак слід зробити важливе розмежування. buttonOriginalWidth
Вище повинні бути встановлено у viewDidLoad , щоб запобігти будь-якому мінливі кнопки ширини до властивості доступу.
2. Скрізь скрізь
Здебільшого слід уникати неочікуваних необов’язаних додатків, оскільки при неправильному використанні весь ваш додаток вийде з ладу під час доступу до нього nil
. Якщо ви ніколи не знаєте, чи може змінна може бути нульовою, завжди використовуйте звичайну необов'язково. Розгортання змінної, яка ніколи, nil
звичайно, не дуже шкодить.
if someOptional
.