在Swift中使用if let语法展开双重可选(Type ??)?

时间:2015-11-19 21:50:48

标签: ios swift optional

如果我尝试编译以下代码,它将在print行上失败。

func foo(application: UIApplication) {
    if let window = application.delegate?.window {
        print(window.frame) // SYNTAX ERROR
    }
}

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

  

错误:可选类型的值' UIWindow?'没有打开;你的意思是使用'!'或者'?'?

我可以通过这样做来解决它:

func foo(application: UIApplication) {
    if let window = application.delegate?.window {
        if let window = window {
            print(window.frame)
        }
    }
}

然而,这增加了更多的代码行,似乎不应该是必要的。如果if let <variable> = <value>被发现为非window,我认为nil应该仅执行其正文。

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

  • 如果application.delegate = nil,请不要执行该阻止。
  • 如果application.delegate.window = nil,请不要执行该阻止。
  • 如果application.delegate.window != nil,请执行该块,并允许我将window用作非可选UIWindow

为什么if let window = application.delegate?.windowwindow定义为可选项?有没有什么方法可以让它像上面的第二个片段一样添加很少或没有代码?

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

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

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案......

x