【问题标题】:Unwrap a double optional (Type??) with if let syntax in Swift? [duplicate]在 Swift 中使用 if let 语法解开双可选(Type??)? [复制]
【发布时间】:2015-11-19 21:50:47
【问题描述】:

如果我尝试编译以下代码,它将在 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 定义为可选项?有什么方法可以通过添加很少或不添加代码使其表现得像上面的第二个 sn-p?

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

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

【问题讨论】:

  • 您的错误是 Optional.None (nil) 与 Optional.Some(Optional.None) (not nil) 不同。这就像说一个丢失的盒子与一个里面没有第二个预期盒子的盒子不同。

标签: ios swift optional


【解决方案1】:

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

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

【讨论】:

  • @MrsEd 为什么不是答案?
  • @MrsEd 我也不明白这一点......
  • StackOverflow 是一个问答网站,而不是论坛。因此,最好将答案表述为 answers 而不是问题。除此之外,它可能会使临时(重新)观众感到困惑。
  • 好的。谢谢你的澄清。编辑答案以明确它实际上是一个答案...... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2016-12-10
相关资源
最近更新 更多