为什么类型的主窗口是双选的?

Arb*_*tur 38 optional uiwindow ios swift

访问UIapplication's主窗口时,它将作为a返回UIWindow??

let view = UIApplication.sharedApplication().delegate?.window // view:UIWindow??
Run Code Online (Sandbox Code Playgroud)

为什么它作为双重可选项返回,它是什么意思,如果放入一个if let应该添加一个!之后?

if let view = UIApplication.sharedApplication().delegate?.window!
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是?!后代表代替,但那不是解决方案.

Rob*_*ier 29

@matt有详细信息,但有一个(有点可怕,有点可怕)的解决方法.(见下面的编辑)

let window = app.delegate?.window??.`self`()
Run Code Online (Sandbox Code Playgroud)

我会将对这一行代码的理解作为读者的练习.

好吧,我说谎,让我们分解吧.

app.delegate?.window
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止一切顺利.在这一点上,我们UIWindow??让我们头痛(我相信Swift和Cocoa之间的Swift脱节是一个错误).我们想要崩溃两次.我们可以使用可选的链接(?.)来做到这一点,但是它会解开和重新打包,所以我们回到了我们开始的地方.你可以使用双重可选链,但这??.很奇怪,但是很有效.

这很好,但??不是合法的后缀运算符.你必须实际上链接到某个东西.好吧,我们想要回归自己(即"身份").该NSObject协议为我们提供了一个身份的方法:self.

self是一个方法NSObject,但它也是Swift中的保留字,所以它的语法是`self`()

所以我们把疯狂放在上面.照你的意愿去做.

请注意,自从??.工作以来,您在技术上并不需要这样做.你可以接受viewUIWindow??,并用??.它喜欢view??.frame.它有点吵,但可能不会为它应该需要的少数几个地方带来任何真正的问题.

(*)我曾经认为这是Swift中的一个错误,但它不能通过可选链接直接修复.问题是没有可选的链接过去window.所以我不确定在哪里找到合适的地方.Swift可以允许后缀?- 意味着"变平"而不需要链接,但这感觉很奇怪.我想合适的操作员将是interrobang delegate?.window?:D我确信这不会引起任何混淆.

编辑:

Joseph Lord指出了更好的解决方案(这与我一直用来避免琐碎的if-let的技术非常类似,但之前没有考虑过这种方式):

let window = app.delegate?.window ?? nil // UIWindow?
Run Code Online (Sandbox Code Playgroud)

我同意他的看法,这是正确的答案.


mat*_*att 17

这是因为该window物业本身存在疑问(可选).因此,您需要一个问号因为可能存在或不存在窗口属性,而另一个问号是因为该窗口属性的返回值本身是可选的.因此,我们得到一个双重包装的可选(正如我在我的教程中解释的那样:向下滚动到提示框,我在其中讨论当可选属性具有Optional值时会发生什么).

因此,为了表达这一个办法是分两个阶段-一个投(和解开可选),以及一个获取窗口(并解开可选):

if let del = UIApplication.sharedApplication().delegate as? AppDelegate {
    if let view = del.window {
Run Code Online (Sandbox Code Playgroud)

现在view是一个UIWindow.

当然,如果你确定你的地面(你可能是你的地面),你可以强制第一行中的强制转换和第二行中的展开.所以,在Swift 1.2中:

let del = UIApplication.sharedApplication().delegate as! AppDelegate
let view = del.window!
Run Code Online (Sandbox Code Playgroud)

  • 至少在6.3中,`delegate`的类型是`UIApplicationDelegate?`.可选的链接应该摆脱额外的可选层. (2认同)