Прежде чем я смогу описать варианты использования для неявно развернутых необязательных опций, вы должны уже понять, что за дополнительные и неявно развернутые необязательные компоненты есть в Swift. Если вы этого не сделаете, я рекомендую вам сначала прочитать мою статью о дополнительных
Когда использовать неявно развернутую опцию
Есть две основные причины, по которым можно создать неявно развернутый необязательный параметр. Все это связано с определением переменной, к которой никогда не будет доступа, nil
потому что в противном случае компилятор Swift всегда заставит вас явно развернуть Optional.
1. Константа, которую нельзя определить во время инициализации
Каждая константа-член должна иметь значение к моменту завершения инициализации. Иногда константа не может быть инициализирована с ее правильным значением во время инициализации, но она все еще может иметь значение до доступа.
Использование необязательной переменной позволяет обойти эту проблему, поскольку Optional автоматически инициализируется с помощью, 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
. Неявно развернутый необязательный параметр имеет встроенное утверждение для nil. Даже тогда часто бывает полезно развернуть необязательное и использовать более описательный атрибут, если он равен нулю.
Когда не использовать неявно развернутую опцию
1. Ленивые вычисляемые переменные-члены
Иногда у вас есть переменная-член, которая никогда не должна быть nil, но она не может быть установлена на правильное значение во время инициализации. Одним из решений является использование Неявного Unwrapped Optional, но лучше использовать переменную lazy:
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, всегда по умолчанию используется обычный Optional. Развертывание переменной, которая никогда не будет, nil
конечно, не повредит.
if someOptional
.