Что значит ?? имеется ввиду на объявлении переменной в случае Swift пусть сопоставление с образцом? - PullRequest
3 голосов
/ 01 ноября 2019

Я рассматриваю некоторые запросы извлечения внутри и вижу оператор сопоставления с шаблоном, подобный следующему:

if case let presentationAnchor?? = UIApplication.shared.delegate?.window,

Теперь я понимаю, ?? является оператором слияния nil при использовании на другой стороне =, например aString ?? "default value", но что это, когда он используется в левой части задания =? Это какой-то способ развернуть опционально при его назначении?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019
if case let someVar? = anotherVar

является синтаксисом сахара для

if case let .some(someVar) = anotherVar

Добавление еще одного знака вопроса расширяется до двойного необязательного значения, эквивалентного

if case let .some(.some(someVar)) = anotherVar

Два знака вопроса на левой стороне шаблона«match» означает, что if будет выполнено, если необязательный аргумент double содержит значение, отличное от nil, на обоих уровнях.

1 голос
/ 01 ноября 2019

В контексте сопоставления с шаблоном x? является «необязательным шаблоном» и эквивалентно .some(x). Следовательно, case x?? является «двойным необязательным шаблоном» и эквивалентно .some(.some(x)).

Он используется здесь, поскольку UIApplication.shared.delegate?.window оценивается как «двойной необязательный» UIWindow??, сравните Почемуглавное окно типа double необязательно? .

Поэтому

if case let presentationAnchor?? = UIApplication.shared.delegate?.window

соответствует случаю, когда UIApplication.shared.delegate не равен nil , а делегат реализует (необязательно)) window собственность. В этом случае presentationAnchor связан с «дважды развернутым» UIWindow.

См. Также Необязательный шаблон в справочнике Swift:

Необязательношаблон соответствует значениям, заключенным в some(Wrapped) регистр перечисления Optional<Wrapped>. Необязательные шаблоны состоят из шаблона идентификатора, за которым сразу следует знак вопроса, и появляются в тех же местах, что и шаблоны регистрационных перечислений.

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