Swift:如果图像存在,return它,否则return nil
Swift: If image exists, return it, otherwise return nil
我一直在寻找一种方法来检查 swift 中是否存在 SF 符号和图像。
在我遇到的所有答案中,都使用了 nil 合并运算符 (??
),这需要始终存在的 default
图像。这对我来说不起作用。
我想测试图像(或符号)是否存在,然后 return 如果它存在,否则 return nil
.
如何实现?
重要提示
我正在尝试使用 SwiftUI
的 Image
来实现多平台应用程序。我试图避免使用 UIImage
或 NSImage
进行检查。
更新 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 如果无法识别名称,则使用某种占位符图像。
如果你想检测名字是否被识别,你可以尝试用它创建一个UIImage
。 UIImage.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 创建了案例,然后使用简洁的检查来确定图像是否存在并进行逻辑处理。
最后,我能够避免在实际检查之外使用 UIImage
或 NSImage
。
这是一种非正统且低效的方法,但这就是我的代码最终的样子:
对于自定义图像
#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
我一直在寻找一种方法来检查 swift 中是否存在 SF 符号和图像。
在我遇到的所有答案中,都使用了 nil 合并运算符 (??
),这需要始终存在的 default
图像。这对我来说不起作用。
我想测试图像(或符号)是否存在,然后 return 如果它存在,否则 return nil
.
如何实现?
重要提示
我正在尝试使用 SwiftUI
的 Image
来实现多平台应用程序。我试图避免使用 UIImage
或 NSImage
进行检查。
更新 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 如果无法识别名称,则使用某种占位符图像。
如果你想检测名字是否被识别,你可以尝试用它创建一个UIImage
。 UIImage.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 创建了案例,然后使用简洁的检查来确定图像是否存在并进行逻辑处理。
最后,我能够避免在实际检查之外使用 UIImage
或 NSImage
。
这是一种非正统且低效的方法,但这就是我的代码最终的样子:
对于自定义图像
#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