在尝试检查返回值时,我遇到了一个奇怪的情况,我想知道如何在Swift意义上"正确地"执行此操作.
我有一个NSStatusItem(命名item),我正在尝试分配NSStatusItem一个NSImage.当我创建它时NSImage,因为我传递了一个图像名称的字符串值,我想确保它NSImage实际上是有效的(如果我输错了图像名称字符串怎么办?).
我尝试的第一件事是:
if let image: NSImage? = NSImage(named: "CorrectIconName") {
item.image = image
}
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误"条件绑定中的绑定值必须是可选类型".我认为这句话image: NSImage?清楚表明它是可选的,但我猜不是.
我改变了这个:
let image: NSImage? = NSImage(named: "CorrectIconName")
if image {
item.image = image
}
Run Code Online (Sandbox Code Playgroud)
哪个工作完全正常.但是我不知道为什么会这样,而第一个例子却没有.看起来或多或少完全相同.由于第一个没有编译,我以为我会尝试其他一些路线......
既然NSImage(named:)返回an NSImage而不是an NSImage?,我想我会看到如果我将构造函数的返回值直接分配给item:
item.image = NSImage(named: "CorrectIconName")
Run Code Online (Sandbox Code Playgroud)
哪个有效,但不允许我想做的错误检查.如果字符串错误,则NSStatusItem获取nil图像,这会导致我有一个不可见的状态栏项.
接下来,我尝试了这个:
let image: NSImage = NSImage(named: "CorrectIconName")
if image {
item.image = image
}
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误"Type'NSImage'没有确认协议'LogicValue'",我想这意味着你nil不能用if语句来检查它是否存在.
但是,您可以通过执行以下操作来检查它是否为零:
let image: NSImage = NSImage(named: "CorrectIconName")
if image != nil {
item.image = image
}
Run Code Online (Sandbox Code Playgroud)
所以,这里有一个问题:如果它不是可选的,那么应该如何检查返回值?
Nat*_*ook 15
它实际上是可选的,编译器只是没有显示给你.
在Apple关于使用Objective-C对象的文档中,它说从Objective-C API导入的所有对象实际上都是隐式解包的选项(就像我们手动声明的那样!):
在某些情况下,您可能绝对确定Objective-C方法或属性永远不会返回
nil对象引用.为了使这个特殊场景中的对象更方便使用,Swift将对象类型导入为隐式解包的选项.隐式展开的可选类型包括可选类型的所有安全功能.此外,您可以直接访问该值,而无需nil自行检查或解包.[ 来源 ]
不幸的是,编译器/语法检查器不会这样对待它们.因此,正确的检查方式是声明image为NSImage初始化程序实际返回的类型,隐式解包的可选项NSImage:
let image: NSImage! = NSImage(named: "CorrectIconName")
if image {
// do something
}
Run Code Online (Sandbox Code Playgroud)
替代方法(来自@vacawama):
if let image = NSImage(named: "CorrectIconName") as NSImage! {
// do something
}
Run Code Online (Sandbox Code Playgroud)