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

let view = UIApplication.sharedApplication().delegate?.window // view:UIWindow??

为什么它作为双可选返回,这意味着什么?如果放入if let,我应该在后面添加一个!吗?

if let view = UIApplication.sharedApplication().delegate?.window!

我的第一个 idea 是用!代替?,但这不是解决方案.

推荐答案

@马特有细节,但有一个(有点可怕,有点可怕)的解决办法.(不过请参见下面的编辑)

let window = app.delegate?.window??.`self`()

我将把这一行代码的理解留给读者作为练习.

好吧,我撒谎,让我们把它分解.

app.delegate?.window

好的,到目前为止还不错.在这一点上,我们有UIWindow??个让我们头疼的问题(我认为这是Swift中的一个错误,Swift和Cocoa之间的脱节).我们想把它折叠两次.我们可以通过可选的链接(?.)来实现这一点,但这会打开和重新包装,所以我们回到了起点.不过,你可以 Select 双倍的??.,这很奇怪,但很有效.

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

selfNSObject上的一个方法,但在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?

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

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

是否在字符串属性上搜索数组和子数组?

当TextField变为空时,不会触发onChange

从AppKit打开SwiftUI设置

SwiftUI:为什么@State在子视图中持续存在?

如何获取嵌套数组中项的路径以修改数组?

如何将新事例添加到枚举中?

领域异常中的相同方法:发送到实例的无法识别的 Select 器

我们如何显示关于 UITextField 是 xCode Swift 的建议?

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

Vapor Swift 如何配置客户端连接超时

如何从 Swift 中的字符串生成条形码?

哪些版本的 Xcode 支持哪些版本的 Swift?

在 Swift 中以编程方式更新约束的常量属性?

为 UIImagePicker 设置委托返回错误

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

在 Swift 中子类化 NSObject - 初始化器的最佳实践

如何使用 Swift 将文本文件逐行加载到数组中?

如何快速将弹出框调整为表格视图中内容的大小?

iOS:如何检测用户是否订阅了自动更新订阅