Ios 使用Swift中的if-let语法展开双精度可选(类型??)?

Ios 使用Swift中的if-let语法展开双精度可选(类型??)?,ios,swift,optional,Ios,Swift,Optional,如果我试图编译以下代码,它将在打印行失败 原因是窗口的类型为UIWindow?,而不是UIWindow: 错误:可选类型“UIWindow”的值未展开;你想用“!”吗还是“?” 我可以这样做来修复它: func foo(application: UIApplication) { if let window = application.delegate?.window { if let window = window { print(window.f

如果我试图编译以下代码,它将在打印行失败

原因是窗口的类型为UIWindow?,而不是UIWindow:

错误:可选类型“UIWindow”的值未展开;你想用“!”吗还是“?”

我可以这样做来修复它:

func foo(application: UIApplication) {
    if let window = application.delegate?.window {
        if let window = window {
            print(window.frame)
        }
    }
}
然而,这增加了更多的代码行,似乎不必要。我认为if let=应该只在发现窗口为非nil时执行其主体

换句话说,我希望它会使用这种逻辑:

如果application.delegate=nil,则不执行该块。 如果application.delegate.window=nil,则不执行该块。 如果application.delegate.window!=nil,执行该块并允许我将窗口用作非可选的UIWindow。 为什么让window=application.delegate?.window将窗口定义为可选窗口?我有没有办法通过添加少量或不添加代码来让它像上面的第二个代码片段那样工作

注意:我不想使用printwindow?.frame,因为打印只是一个示例。我实际上有更多的代码,不想使用空对象模式。我希望它真的被定义为非可选的


更新:如果我使用let test=application.delegate?.window,我会看到类型是UIWindow???,或者是双可选的。这就解释了为什么我需要第二个let语句。所以我想我现在的问题是什么是打开双可选的最简洁的方法?

一个可能的解决方案

if let window = application.delegate?.window ?? nil {
  print(window.frame)
}

还有一个副本。您的错误是可选的。None nil不同于Optional.SomeOptional.None不是nil。这就好比说一个丢失的盒子不同于一个里面没有第二个预期盒子的盒子。@MrsEd为什么它不是答案?@MrsEd我也不明白这一点……StackOverflow是一个问答网站而不是论坛。因此,最好将答案表述为答案,而不是问题。除此之外,它可能会让漫不经心的评论者感到困惑。谢谢澄清。编辑答案以明确它实际上是一个答案…:
if let window = application.delegate?.window ?? nil {
  print(window.frame)
}