@马特有细节,但有一个(有点可怕,有点可怕)的解决办法.(不过请参见下面的编辑)
let window = app.delegate?.window??.`self`()
我将把这一行代码的理解留给读者作为练习.
好吧,我撒谎,让我们把它分解.
app.delegate?.window
好的,到目前为止还不错.在这一点上,我们有UIWindow??
个让我们头疼的问题(我认为这是Swift中的一个错误,Swift和Cocoa之间的脱节).我们想把它折叠两次.我们可以通过可选的链接(?.
)来实现这一点,但这会打开和重新包装,所以我们回到了起点.不过,你可以 Select 双倍的??.
,这很奇怪,但很有效.
这很好,但??
不是合法的后缀运算符.你必须把自己拴在某个东西上.好吧,我们想要回到自身(即"身份").NSObject
协议为我们提供了一种身份识别方法:self
.
self
是NSObject
上的一个方法,但在Swift中也是一个保留字,所以它的语法是`self`()
所以我们的疯狂就在上面.你想怎么做就怎么做.
请注意,既然??.
可以工作,从技术上讲,你并不需要这个.你可以接受view
等于UIWindow??
,然后像view??.frame
一样使用??.
.它有点吵,但可能不会给少数需要它的地方带来任何真正的问题.
(*)我以前认为这是Swift中的一个bug,但它不能通过可选链接直接修复.问题是没有超过window
的可选链接.所以我不确定该把它修好的地方在哪里.Swift 可以允许后缀-?
表示"扁平",而不需要链锁,但这感觉很奇怪.我想正确的接线员应该是interrobang delegate?.window‽
:D,我相信这不会引起任何混乱.
编辑:
Joseph Lord pointed out the better solution(这非常类似于我一直在使用的技术,以避免琐碎的if let,但以前从未想过这种方式):
let window = app.delegate?.window ?? nil // UIWindow?
我同意他的看法,这是正确的答案.