【发布时间】: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?.window 将window 定义为可选项?有什么方法可以通过添加很少或不添加代码使其表现得像上面的第二个 sn-p?
注意:我不想使用print(window?.frame),因为打印只是一个例子。我实际上有更多代码并且不想使用空对象模式。我希望它真的被定义为非可选的。
更新:如果我使用let test = application.delegate?.window,我看到类型是UIWindow??,或者是双可选。这解释了为什么我确实需要第二个 let 语句。所以我想我现在的问题是打开双可选的最简洁的方法是什么?
【问题讨论】:
-
您的错误是
Optional.None(nil) 与Optional.Some(Optional.None)(not nil) 不同。这就像说一个丢失的盒子与一个里面没有第二个预期盒子的盒子不同。