【发布时间】:2014-06-26 20:37:14
【问题描述】:
我在尝试检查返回值时遇到了一个奇怪的情况,我想知道如何在 Swift 意义上“正确”执行此操作。
我有一个NSStatusItem(名为item),我正在尝试将NSStatusItem 分配给NSImage。当我创建NSImage 时,因为我将图像名称的字符串值传递给它,所以我想确保NSImage 实际上是有效的(如果我输入错误的图像名称字符串怎么办?)。
我尝试的第一件事是:
if let image: NSImage? = NSImage(named: "CorrectIconName") {
item.image = image
}
但这会产生错误“条件绑定中的绑定值必须是可选类型”。我以为image: NSImage? 说得很清楚它是可选的,但我想不是。
我把它改成了这样:
let image: NSImage? = NSImage(named: "CorrectIconName")
if image {
item.image = image
}
这完全没问题。但我不明白为什么会这样,而第一个例子没有。似乎或多或少是完全相同的东西。而且由于第一个没有编译,我想我会尝试一些其他的路线......
由于NSImage(named:) 确实返回NSImage 而不是NSImage?,我想如果我将构造函数的返回值直接分配给item 会发生什么:
item.image = NSImage(named: "CorrectIconName")
这可行,但不允许进行我想做的错误检查。如果字符串错误,NSStatusItem 会为图像获取nil,这导致我有一个不可见的状态栏项目。
接下来,我尝试了这个:
let image: NSImage = NSImage(named: "CorrectIconName")
if image {
item.image = image
}
但这给出了错误“类型'NSImage'不确认协议'LogicValue'”,我猜这意味着你不能使用if语句检查它是否是nil。
但是,您可以通过执行以下操作来检查它是否为 nil:
let image: NSImage = NSImage(named: "CorrectIconName")
if image != nil {
item.image = image
}
那么,问题来了:如果返回值不是可选的,应该如何检查返回值?
【问题讨论】:
-
好问题,但我认为这里真正的问题是:为什么
init(name:)返回NSImage?我相信答案很简单:“它是自动 ObjC -> Swift 标头生成器的错误,请提交错误报告!” -
@JackWu,这种行为也可能是一个错误。不过我不确定!
标签: swift