swift - 如何检查一个表达式中 Optional 是否不为 nil 且属性是否为真?

标签 swift

使用 Swift,我有一个 NSStatusItem,当我单击它时,我想检查 NSWindow 是否可见。如果是,隐藏它,如果不是,调用一个函数来显示 NSWindow

我的 NSWindow 是我的应用委托(delegate)中的一个类属性,var window: NSWindow?。在我响应点击 NSStatusItem 的方法中,我尝试使用可选链接来执行以下操作:

if self.window?.visible {
    self.window!.orderOut(self) // or self.window?.orderOut(self), same behavior
}
else {
    displayWindow()
}

但是,如果 window not nil,它每次都会进入 if block 。如果 window nil,它每次都会进入 else block 。换句话说,这似乎不起作用。我无法检查 window 是否不是 nil 以及 window 在一个表达式中是否可见。 (我认为这是一个明显使用可选链接的地方。)

我试过了,只是想看看会发生什么:

if self.window!.visible {
    self.window!.orderOut(self)
}
else {
    displayWindow()
}

如果 windownot nil,这会起作用。 window 首先是隐藏的,所以它命中 else block 并显示窗口。下次调用该方法时,window 是可见的,因此它执行 else block 。等等。正是我想要的,except 我无法检查 window 是否为 nil。如果它是 nil,我会得到明显的崩溃“fatal error: Can't unwrap Optional.None

以下允许我检查 window 是否为 nil,然后检查它是否可见:

if let win = self.window {
    if win.visible {
        win.orderOut(self)
    } else {
        displayWindow()
    }
}
else {
    NSLog("self.window == nil")
}

然而,这很罗嗦,我真的认为我应该能够做到第一种方式。我真的必须用第三种方式吗?或者我假设第一种情况不工作是错误是正确的吗?

编辑:这种方式也有效:

if self.window && self.window!.visible {
    self.window?.orderOut(self)
}
else {
    displayWindow()
}

但话说回来,Optional Chaining 不就是为了取代这种东西吗?

最佳答案

编辑:

Cezar 的 解决方案(下面的第一条评论)被证明更正确:

self.window?.visible == true

我的以下解决方案存在严重缺陷。如果 self.windownil,它将尝试解包 nil 并崩溃。

--旧答案--

正如我在评论中提到的:

当你使用 Optional Chaining 时,返回值总是一个 Optional。这意味着 self.window?.visible 返回 Bool?。并且由于当 window 不是 nil 时它始终存在,因此它将通过检查。

这在 Swift 书籍中关于可选链的部分进行了解释。这是有道理的,因为当您使用可选链接时,返回值总是有机会返回 nil,而这并不取决于“链”中的最终值。

注意:以上仍然正确,但以下建议很糟糕:[

所以你想要的语法是:

(self.window?.visible)!

这里有一些代码供您粘贴到 Playground 中以玩转此行为:

import Foundation
class a {
    let t = true;
    let f = false;
}

class b {
    var A:a?
}

let B = b()
B.A = a()

if B.A?.f == true {
    println("true")
}
else {
    println("false") // prints False
}

关于swift - 如何检查一个表达式中 Optional 是否不为 nil 且属性是否为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24459771/

相关文章:

ios - Swift - IBAction vs Delegate vs addTarget

ios - index ScrollTo 不适用于 TableViewCell Swift 中的最后一个 CollectionView

ios - 如何在同一 View 中使用具有不同数据源的多个选择器 View ?

ios - 如何将 Alamofire 与 AEXML 或 SWXMLHASH 结合使用

Swift Siesta 重定向对失败的响应

swift - 在真实设备上快速测试地理点进行解析

ios - 什么时候在 Swift 中使用@objc?

ios - Collection View 单元格之间不需要的空间 组合布局

swift - 我如何编写一个函数,它接受泛型类型参数,但根据泛型对象的类型返回不同的类型?

swift - 快速访问嵌套键值对