gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:31 24 4
gpt4 key购买 nike

使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com