Да opt?.isEmpty
отличается от String?
.Это называется optional chaining .С быстро Руководством по программированию:
Можно указать дополнительные цепочки, поставив знак вопроса после дополнительного значения, на котором вы хотите позвонить (?) свойство, метод или индекс , если необязательный параметр не равен нулю. Это очень похоже на отметку восклицательного знака (!) После необязательного значения, чтобы заставить разворачивать его значение. Основное различие заключается в том, что необязательная цепочка изящно выходит из строя, когда опция равна нулю, тогда как принудительная разворачиваемость запускает ошибку времени выполнения, когда опция равна нулю.
Это создает дополнительные, как вы думаете var opt: String?
Теперь
opt?.isEmpty //it will not crash if opt is nil
такой же, как за исключением
opt!.isEmpty //it will crash if opt is nil
если opt!
является nil
, чем он не будет врезаться в runtime.Optional сцепления используется для вызова длинных последовательностей необязательно без calling.Every дополнительного цепочка возвращается дополнительно, т. е. выбрать? возвращает необязательный разворачивает его, и если nil, чем не вызов isEmpty else, вызов isEmpty и reutns value. Также
(opt?).isEmpty
Когда вы пишете выше заявление это только по желанию (не опция опционного) и он не разворачивать из-за скобки.Таким образом, ошибка показывает
$T2?? does not have a member named `isEmpty`
разворачивать его использовать
(opt?)!.isEmpty
он возвращает ложное
Edit: Для уточнения более
var o1 = opt?
var o2 = ((opt?)?)
не делает ничего в своей собственной он просто присваивает то же значение o1
, o2
i.e String ?. для разворота opt
и o1
, o2
оба они являются необязательными и нуждаются в одном !
операторах, чтобы развернуть его.
Также, пожалуйста, не понимайте между String?
и opt?
они оба разные, когда? используются после того, как какой-то тип в decleration это делает необязательным и когда ?
используется после переменной opt
используется для развёртки в необязательной цепочке и вернуть необязательное значение он возвращается
Extra Материал:
попробовать это более уточнить
(((opt?)?)!).isEmpty //it will unwrap with single !
((((opt?)?)!)?).isEmpty //compiler will show suggestion to remove ?
ниже заявление делает необязательным факультативных опционального
var opt:String??? = "Optional"
разворачивать
opt!!!.isEmpty
EDIT2
opt?
всегда возвращают необязательный, но если opt
определяется как строки! это implicit optional
и opt?
вернется optional(explicit)
. если opt
уже необязательно opt?
не будет делать ничего
От быстро руководства по программированию
Говоря иначе:
If the type you are trying to retrieve is not optional, it will become optional because of the optional chaining.
If the type you are trying to retrieve is already optional, it will not become more optional because of the chaining.
Поэтому:
If you try to retrieve an Int value through optional chaining, an Int? is always returned, no matter how many levels of chaining are used.
Similarly, if you try to retrieve an Int? value through optional chaining, an Int? is always returned, no matter how many levels of chaining are used.
Вопрос заключается в том, отличается ли 'opt? .isEmpty' от (грубо)' (opt?). IsEmpty' (это, безусловно, похоже), и если да, то что происходит, когда 'opt?' Оценивается на его независимо от того, что происходит, когда оно оценивается как часть необязательной цепочки. Очевидно, что «развернуть (если не« nil ») или оставить в покое (если« nil') »не будет адекватным определением'? ', Потому что это не так, как оно себя ведет. – orome
Эффективное место для начала ответа будет ясным объяснением того, что именно 'opt?' * Собственный собственный имеет вообще * (есть ли у нас 'var opt: Type?' Или 'var opt: Type!'). – orome
«Тип?» И «Тип!» - это аннотации типов *, которые отличаются от 'opt?' Или 'opt!'. Как объяснено ниже, 'opt?' Ничего не делает на своем собственном ". –