Swift:如果图像存在,return它,否则return nil

Swift: If image exists, return it, otherwise return nil

我一直在寻找一种方法来检查 swift 中是否存在 SF 符号和图像。
在我遇到的所有答案中,都使用了 nil 合并运算符 (??),这需要始终存在的 default 图像。这对我来说不起作用。

我想测试图像(或符号)是否存在,然后 return 如果它存在,否则 return nil.

如何实现?

重要提示
我正在尝试使用 SwiftUIImage 来实现多平台应用程序。我试图避免使用 UIImageNSImage 进行检查。

更新 1

注1: 当请求不存在的 SF Symbol 时(例如,systemName: [name] 参数中有错字),图像显示为空白区域。 (使用 Label 测试)

以下解决方案经测试无效:
(注意:在所有的尝试中,都有一个变量name: String

解决方案 1

let image = Image(systemName: name)
if image {
    return image
} else {
    return nil
}

抛出错误:

Cannot convert value of type 'Image' to expected condition type 'Bool'

它在以下情况下抛出完全相同的错误:let image = Image(name)

解决方案 2

if let image = Image(systemName: name) {
    return image
}

抛出错误:

Initializer for conditional binding must have Optional type, not 'Image'

解决方案 3

let image = Image(systemName: name)
if image != nil {
    return image
}

不起作用并发出警告:

Comparing non-optional value of type 'Image' to 'nil' always returns true

正如您所发现的,Image.init(systemName:) returns 如果无法识别名称,则使用某种占位符图像。

如果你想检测名字是否被识别,你可以尝试用它创建一个UIImageUIImage.init?(systemName:) returns nil 如果名称无法识别。

let image: Image? = UIImage(systemName: name)
    .map { Image(uiImage: [=10=]) }

上述 Image 在某些方面可能与使用 Image(systemName:) 创建的图像不同。我不确定。因此,如果这是一个问题,您可以改为执行以下操作:

let image: Image? = UIImage(systemName: name)
    .map { _ in Image(systemName: name) }

根据 @rob mayoff 的回答,我最终为 OS 创建了案例,然后使用简洁的检查来确定图像是否存在并进行逻辑处理。

最后,我能够避免在实际检查之外使用 UIImageNSImage
这是一种非正统且低效的方法,但这就是我的代码最终的样子:

对于自定义图像

#if os(macOS)
if (NSImage(named: name)) != nil {
    //image found, do some logic...
}
#elseif os(iOS)
if (UIImage(named: name)) != nil {
    //image found, do some logic...
}
#endif

对于系统符号

#if os(macOS)
if (NSImage(systemSymbolName: name, accessibilityDescription: "")) != nil {
    //image found, do some logic...
}
#elseif os(iOS)
if (UIImage(systemName: name)) != nil {
    //image found, do some logic...
}
#endif