Как работает «?»разворачивать необязательное в случае объявления? - PullRequest
2 голосов
/ 27 апреля 2019

Почему ? in a? разворачивает значение во время присваивания?

Я видел подобное поведение только в необязательном сцеплении, но за ? в переменной всегда должен следовать вызов, поиск члена или индекс, насколько я знаю.

var x: Int? = 42

if case let a? = x {
    print(a)
}

1 Ответ

3 голосов
/ 27 апреля 2019

Это синтаксический сахар для шаблонов параметров.В документации по опционному шаблону написано:

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

Таким образом, ваш код такой же, как:

var x: Int? = 42

if case .some(let a) = x {
    print(a)
}

Это не типично для простых if операторов, так как вы можете просто сделать это вместо этого:

if let a = x {
    print(a)
}

Но рассмотрите перечисление, заключенное в необязательный:

enum Foo {
    case bar
    case baz
}

let y: Foo? = .bar

switch y {
case .none: break
case .some(.bar): break
case .some(.baz): break
}

Этот ключ можно записатьболее кратко, используя немного сахара:

switch y {
case nil: break
case .bar?: break
case .baz?: break
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...