какой путь предпочтительнее
Общепринято, что вам следует избегать !
(принудительное развертывание), которое просто напрашивается на сбой, поэтому этого использования следует избегать:
if let image = UIImage(named: "Pin") {
pinImageView = UIImageView(image: image)
pinImageView!.restorationIdentifier = "pin"
}
В этом случае, поскольку вы только что присвоили pinImageView
, принудительная распаковка безопасна, но она по-прежнему вызывает тревогу у вас или любого другого, кто будет читать ваш код в будущем. "Тьфу, они используют принудительную развертку здесь. Может ли это произойти сбой? Ну, может ли pinImageView
быть nil
? Нет, это было просто назначено в предыдущей строке, так что все в порядке." Зачем подвергать себя и других этому мыслительному процессу; по возможности избегайте !
.
Это использование:
if let image = UIImage(named: "Pin") {
pinImageView = UIImageView(image: image)
pinImageView?.restorationIdentifier = "pin"
}
безопаснее, потому что он использует необязательную цепочку для развертывания pinImageView
и избегает оператора сбоя !
, но по-прежнему разворачивает необязательную переменную.
Третий вариант:
Причина, по которой imageView является необязательным, заключается в том, что вы присвоили его необязательной переменной. Если вместо этого вы используете константу let
для хранения объекта во время его настройки, вы можете избежать заполнения своего кода кодом распаковки:
if let image = UIImage(named: "Pin") {
let imageView = UIImageView(image: image)
imageView.restorationIdentifier = "pin"
pinImageView = imageView
}
Этот метод хорошо работает, когда вы назначаете много свойств объекту, так как вы можете избежать множества операций развертывания.
Не беспокойтесь о лишней строке кода. Компилятор оптимизирует это. Код для удобочитаемости и ясности.
person
vacawama
schedule
15.07.2018
!
) всегда не рекомендуется, так как это может привести к сбою вашего приложения. В приведенном выше примере, хотяpinImageView
инициализируется непосредственно перед использованием принудительной развертки (!
) на нем, и он будет работать, как и ожидалось, с обоими подходами выше, но все же я бы рекомендовал первый подход. Избегайте привыкания к проблемному подходу. - person Kamran   schedule 15.07.2018if let image = UIImage(named: "Pin"), let view = UIImageView(image: image) { view.restorationIdentifier = "pin" }
- person NRitH   schedule 15.07.2018!
не обескуражен. У него есть законные варианты использования. Иногда вы просто не можете справиться с делом по-другому. Не стоит заявлять, что ваше приложение не рухнет, а вместо этого создаст неопределенное поведение приложения. Кроме того, я часто вижу, как люди избегают!
, но все же добавляютfatalError()
по всему коду. - person Sulthan   schedule 15.07.2018