【问题标题】:Swift: If image exists, return it, otherwise return nilSwift:如果图像存在,则返回它,否则返回 nil
【发布时间】:2021-11-19 20:02:37
【问题描述】:

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

我想测试一个图像(或符号)是否存在,如果存在则返回,否则返回nil

如何做到这一点?

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

更新 1

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

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

解决方案 1

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

抛出错误:

无法将“图像”类型的值转换为预期条件类型“布尔”

在以下情况下会引发完全相同的错误:let image = Image(name)

解决方案 2

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

抛出错误:

条件绑定的初始化器必须是 Optional 类型,而不是 'Image'

解决方案 3

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

不起作用并给出警告:

比较 'Image' 类型的非可选值与 'nil' 总是返回 true

【问题讨论】:

  • 只返回符号中的图像,它存在就是它,否则它会为零,不是吗?
  • 也许你应该添加一些代码来澄清你的问题。顺便说一句,SF Symbol 怎么可能不存在?
  • 这正是image(named)image(systemName) 已经在做的事情,那么问题是什么?
  • @Lae 我没有意识到这是一个不会出错的初始化程序。 UIKit initializer 将返回零。所以只要用它来检查它是否为nil UIImage(systemName: "whatever") != nil
  • 噢噢噢,你说的是 SwiftUI Image。从最初的问题来看,这并不是很清楚。始终标记(就像 Leo Dabus 现在为您所做的那样)。

标签: image if-statement swiftui symbols exists


【解决方案1】:

如您所见,Image.init(systemName:) 会在名称未被识别时返回某种占位符图像。

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

let image: Image? = UIImage(systemName: name)
    .map { Image(uiImage: $0) }

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

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

【讨论】:

  • 感谢您的回答!我已经知道这个解决方案。但是,在我的情况下,这不是最佳的,因为我使用的是SwiftUIImage。该应用程序是多平台的,我试图避免使用NSImageUIImage
  • 我谦虚地建议您使用#if os(macOS) 来处理 macOS 案例,然后继续进行更重要的工作。 :^)
【解决方案2】:

按照@rob mayoff 的回答,我最终为操作系统创建了案例,然后使用简洁的检查来确定图像是否存在并执行逻辑。

最后,我能够避免在实际检查之外使用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

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2015-01-18
    • 1970-01-01
    • 2012-11-21
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多