gpt4 book ai didi

ios - 为什么double类型的主窗口是可选的?

转载 作者:IT王子 更新时间:2023-10-29 05:02:12 25 4
gpt4 key购买 nike

当访问 UIapplication 的 主窗口时,它作为 UIWindow?? 返回

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

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

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

虽然我的第一个想法是在委托(delegate)之后用 ! 替换 ? 但这不是解决方案。

最佳答案

@matt 有详细信息,但有一个(有点可怕,有点棒)解决方法。 (不过请参阅下面的编辑)

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

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

好吧,我撒谎,让我们分解一下。

app.delegate?.window

好的,到目前为止一切顺利。在这一点上,我们遇到了让我们头疼的 UIWindow??(我相信这是一个 Swift 中的错误 在 Swift 和 Cocoa 之间断开连接)。我们想折叠它两次。我们可以使用可选链接 (?.) 来做到这一点,但它会展开和重新包装,所以我们回到了起点。不过,您可以使用 ??. 双可选链,这很奇怪,但有效。

很好,但是 ?? 不是合法的后缀运算符。您实际上必须链接到某些东西。好吧,我们想链接回自身(即“身份”)。 NSObject 协议(protocol)为我们提供了一个标识方法:self

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

所以我们得到了我们的疯狂。随心所欲地使用它。

请注意,由于 ??. 有效,因此从技术上讲您不需要它。您可以只接受 viewUIWindow?? 并在其上使用 ??. 就像 view??.frame。它有点吵,但可能不会对少数需要它的地方造成任何实际问题。

(*) 我曾经认为这是 Swift 中的一个错误,但它不能通过可选链接直接修复。问题是没有可选的链接超过 window。所以我不确定修复它的正确位置在哪里。 Swift 可以允许后缀-? 表示“展平”而不需要链接,但这感觉很奇怪。我想正确的操作符应该是 interrobang delegate?.window‽ :D 我相信这不会造成任何混淆。

编辑:

Joseph Lord pointed out the better solution (这与我一直用来避免琐碎的 if-let 的技术非常相似,但之前没有想到过这种方式):

let window = app.delegate?.window ?? nil // UIWindow?

我同意他的观点,这是正确的答案。

关于ios - 为什么double类型的主窗口是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28901893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com