Если в Swift развернуть неявно развернутую необязательную оболочку, является ли это двойной разверткой?

Я исследовал разницу между! а также ? в объявлении var.

Кратко о моем вопросе

If you call unwrap! on a a var declared with ! - why isnt this a double unwrap?

Я создал два IBOutlet, вот тогда! используется много

@IBOutlet weak var searchBar1: UISearchBar? //"Optional"
@IBOutlet weak var searchBar2: UISearchBar! //"Implicitly Unwrapped Optional"

Я понимаю, что если количество розеток не равно нулю, то все они будут работать.

self.searchBar1!.text = "dd" //builds ok but crashes on nil
self.searchBar2!.text = "dd" //builds ok but crashes on nil

self.searchBar1?.text = "dd1" //builds ok but does nothing on nil
self.searchBar2?.text = "dd1" //builds ok but does nothing on nil

//---
self.searchBar1.text = "dd2"  //ERROR: 'UISearchBar?' does not have a member named 'text'
self.searchBar1!.text = "dd2" //OK: must unwrap Optional(UISearchBar) to UISearchBar
self.searchBar1!.text = "dd2" //OK: must unwrap Optional(UISearchBar) to UISearchBar 

self.searchBar2.text = "dd2"  //ok unwrap declared in var but will crash if nil
//----

Правильно ли я думаю, что последняя строка работает, потому что развертка находится в объявлении var

это работает, потому что Unwrap! находится в объявлении var

self.searchBar2.text = "dd2" 

Почему не вылетает - разве это не двойное разворачивание

self.searchBar2!.text = "dd" 

self.searchBar является необязательным (UISearchBar) >> Unwrap! self.searchBar2! >> UISearchBar


person brian.clear    schedule 08.12.2014    source источник


Ответы (2)


Два ключевых предложения в книга:

Неявно развернутый необязательный параметр является обычным необязательным за кулисами, но также может использоваться как необязательное значение, без необходимости развертывать необязательное значение каждый раз, когда к нему обращаются.

а также

Неявно развернутый необязательный элемент можно рассматривать как разрешение на автоматическое развертывание необязательного элемента всякий раз, когда он используется.

Насколько я понимаю, неявно развернутый необязательный параметр аналогичен обычному необязательному, и к нему можно получить доступ как к нему, в том числе с помощью развертывания! оператор на нем. Неявное развертывание просто устраняет необходимость в развертывании, вместо того, чтобы превращать его в ошибку, если вы этого не сделаете.

Это «обычный необязательный ... но может также использоваться как необязательное значение» - для меня это означает, что оба метода доступа к нему подходят.

person Matt Gibson    schedule 09.12.2014
comment
Как неявно развернутый необязательный! реализовано. Магия компилятора, например ? изменен на Необязательный ‹T› или в быстрой структуре как некоторая перегрузка оператора, что я искал, поэтому был сбит с толку, когда прочитал это как двойное разворачивание. myVar !!. - person brian.clear; 10.12.2014
comment
Да, насколько мне известно, это магия компилятора, взаимодействующая с типом ImplicitlyUnwrappedOptional. - person Matt Gibson; 10.12.2014

Если переменная var объявлена ​​как Type!, то любая ссылка на var эквивалентна var!. Вы можете подумать, что компилятор добавляет ! каждый раз, когда вы используете эту переменную. Здесь нет «двойной развёртки», это одинарная развёртка.

person vbezhenar    schedule 08.12.2014