@ Matt имеет детали, но есть (несколько попало, несколько удивительным) обходной путь. (См. Править ниже)
let window = app.delegate?.window??.`self`()
Я оставлю понимание этой строки кода в качестве упражнения для читателя.
ОК, я лежу, давайте сломаем его.
app.delegate?.window
ОК, пока все хорошо. На данный момент у нас есть UIWindow??
, который дает нам головную боль (и я считаю, что ошибка
в Swift
отключается между Swift и Cocoa). Мы хотим развалить его дважды. Мы можем сделать это с опциональной цепочкой (?.
), но это разворачивает и перематывает, так что мы вернулись туда, откуда мы начали. Вы можете удвоить-необязательно-цепочку, хотя, с ??.
, что странно, но работает.
Это замечательно, но ??
не является юридическим суффиксом. Вы должны на самом деле цепочки к чему-то. Ну, мы хотим привязать себя к себе (т. Е. «Идентичность»). Протокол NSObject
дает нам метод идентификации: self
.
self
является метод на NSObject
, но это также зарезервированное слово в Swift, поэтому синтаксис для него является `self`()
И таким образом мы получаем наше безумие выше. Делайте с ним, как хотите.
Обратите внимание, что поскольку ??.
работает, вам это не требуется. Вы можете просто принять, что view
is UIWindow??
и использовать ??.
на нем, как view??.frame
. Это немного шумно, но, вероятно, не создает никаких реальных проблем для немногих мест, в которых это необходимо.
(*) Раньше я думал об этом как об ошибке в Swift, но не фиксируется непосредственно путем дополнительной цепочки. Проблема в том, что нет никакой дополнительной привязки минус window
. Поэтому я не уверен, где это место для исправления. Swift может позволить postfix-?
означать «сгладить», не требуя цепочки, но это кажется странным. Я предполагаю, что правильный оператор будет interrobang delegate?.window‽
: D Я уверен, что это не вызовет путаницы.
EDIT:
Joseph Lord pointed out the better solution (который очень похож на методы я использую, чтобы избежать тривиальной, если пусть, но не думал об этом, как и раньше):
let window = app.delegate?.window ?? nil // UIWindow?
Я согласен с ним, что это правильный ответ.
Это не: 'дополнительное окно var: UIWindow? {get set} '- ваш' делегат' является необязательным, хотя (используя '?'), что приводит к еще одному уровню опций. –
Но даже когда я положил! справа от делегата, это все равно дает? – Arbitur
Аналогичный вопрос здесь: http://stackoverflow.com/questions/25175544/uiwindow-does-not-have-member-named-bounds. –