gpt4 book ai didi

swift - 如何正确检查非可选返回值是否有效?

转载 作者:IT王子 更新时间:2023-10-29 05:13:24 25 4
gpt4 key购买 nike

我在尝试检查返回值时遇到了一个奇怪的情况,我想知道如何在 Swift 意义上“正确地”执行此操作。

我有一个 NSStatusItem(名为 item),我正在尝试为 NSStatusItem 分配一个 NSImage。当我制作 NSImage 时,因为我将图像名称的字符串值传递给它,所以我想确保 NSImage 实际上有效(如果我输入错误的图像怎么办?名称字符串?)。

我尝试的第一件事是:

if let image: NSImage? = NSImage(named: "CorrectIconName") {
item.image = image
}

但这给出了错误“条件绑定(bind)中的绑定(bind)值必须是可选类型”。我以为说 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
}

但是这给出了错误“Type 'NSImage' does not confirm to protocol 'LogicValue'”,我猜这意味着你不允许使用 if 语句检查它是否为 nil .

但是,您可以通过执行以下操作来检查它是否为 nil:

let image: NSImage = NSImage(named: "CorrectIconName")
if image != nil {
item.image = image
}

那么,问题来了:如果返回值不是 Optional,那么应该究竟如何检查返回值?

最佳答案

它实际上可选的,编译器只是没有向您显示它。

在 Apple 关于使用 Objective-C 对象的文档中,它说从 Objective-C API 导入的所有对象实际上都是隐式解包的可选对象(就像我们用 ! 手动声明一样):

In some cases, you might be absolutely certain that an Objective-C method or property never returns a nil object reference. To make objects in this special scenario more convenient to work with, Swift imports object types as implicitly unwrapped optionals. Implicitly unwrapped optional types include all of the safety features of optional types. In addition, you can access the value directly without checking for nil or unwrapping it yourself. [source]

不幸的是,编译器/语法检查器并没有这样对待它们。因此,正确的检查方法是将 image 声明为 NSImage 初始化器实际返回的类型,一个隐式展开的可选 NSImage:

let image: NSImage! = NSImage(named: "CorrectIconName")
if image {
// do something
}

替代方法(通过@vacawama):

if let image = NSImage(named: "CorrectIconName") as NSImage! {
// do something
}

关于swift - 如何正确检查非可选返回值是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439773/

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