Swift - вызов .init по типу закрытия - PullRequest
2 голосов
/ 04 июля 2019

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

Так что это действительно правильный код:

var test: ((Bool) -> ())?

test = .init({a in print(a)})

Это, однако, не

test = ((Bool) -> ()).init({a in print(a)})

Причина: "Type" (Bool) -> () 'не имеет члена' init ''

Почему пример один работает? К чему на самом деле относится вызов init?

1 Ответ

3 голосов
/ 04 июля 2019

test является необязательным замыканием, а

test = .init({a in print(a)})

вызывает метод init для Optional, а не для типа замыкания.Это «неявное выражение члена» , потому что тип выводится с левой стороны.Это также становится очевидным, если щелкнуть «Option» по вызову .init в редакторе исходного кода Xcode:

enter image description here

Это эквивалентно обоим из

test = Optional.init({a in print(a)})
test = Optional({a in print(a)})

или просто

test = {a in print(a)}

, поскольку компилятор автоматически оборачивает выражение типа T в Optional<T> при необходимости.

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