SwiftUI-展开可选图像数据以基于UIImage(数据)创建图像

SwiftUI-展开可选图像数据以基于UIImage(数据)创建图像,swift,swiftui,Swift,Swiftui,我发现了这一点,一些答案说我们可以解决两项任务: 如果需要,显示视图元素 或者,如果找到nil,则显示默认值 我有一个数据模型,其中包含可选的数据,我在视图中将其用于我的图像元素 目前,我还没有找到一种方法来解决这个问题并使用这个标志哪个是不安全的: Image(uiImage: UIImage(data: userService.user.imageData!)!) 当然,我不能保证它,我不应该使用这个,但需要一个如何打开它的帮助 作为一种快速解决方法,我可以将此图像数据属性设置为非可选

我发现了这一点,一些答案说我们可以解决两项任务:

  • 如果需要,显示视图元素
  • 或者,如果找到nil,则显示默认值
我有一个数据模型,其中包含可选的
数据
,我在
视图
中将其用于我的
图像
元素

目前,我还没有找到一种方法来解决这个问题并使用这个标志
哪个是不安全的:

Image(uiImage: UIImage(data: userService.user.imageData!)!)
当然,我不能保证它,我不应该使用这个,但需要一个如何打开它的帮助

作为一种快速解决方法,我可以将此图像数据属性设置为非可选,然后从本地文件加载一些数据,但即使如此,我仍有一种强制展开方法:
  • 使用控制语句
  • 使用
    AnyView
    删除类型
查看任意视图的原因
  • 您需要删除该类型,以便视图一致地返回相同的视图类型,而不管它采用哪种执行路径(无论是否满足
    if
    语句)
  • 这样,它将返回
    AnyView
    ,无论返回什么,并满足body类型(
    some View
例子:
  • 如果数据是有效的图像数据,则会显示图像
  • 如果不是,则显示空视图
注意:您可以显示任何其他视图,而不是空视图

代码:
以下变量简单且安全(如果您需要在视图层次结构中始终具有图像),因为
UIImage(data:data())
始终创建有效的空图像

Image(uiImage: UIImage(data: userService.user.imageData ?? Data())!)

您有几个可用选项。我认为最简单的方法是对图像进行扩展,并定义一个新的初始化器,以满足您的需要:

extension Image {

    public init?(data: Data?) {
        guard let data = data,
            let uiImage = UIImage(data: data) else {
                return nil
        }
        self = Image(uiImage: uiImage)
    }
}
然后您可以像这样简单地使用它:

Image(data: userService.user.imageData)
extension Image {

    public init(data: Data?, placeholder: String) {
        guard let data = data,
          let uiImage = UIImage(data: data) else {
            self = Image(placeholder)
            return
        }
        self = Image(uiImage: uiImage)
    }
}
Image(data: userService.user.imageData, placeholder: "nameOfPlaceholder")
由于它是
可空的
,因此需要将它包含在另一个
视图
中,并且至少包含一个其他
视图

如果要提供占位符来代替丢失的图像,可以使用如下扩展:

Image(data: userService.user.imageData)
extension Image {

    public init(data: Data?, placeholder: String) {
        guard let data = data,
          let uiImage = UIImage(data: data) else {
            self = Image(placeholder)
            return
        }
        self = Image(uiImage: uiImage)
    }
}
Image(data: userService.user.imageData, placeholder: "nameOfPlaceholder")
然后您可以像这样简单地使用它:

Image(data: userService.user.imageData)
extension Image {

    public init(data: Data?, placeholder: String) {
        guard let data = data,
          let uiImage = UIImage(data: data) else {
            self = Image(placeholder)
            return
        }
        self = Image(uiImage: uiImage)
    }
}
Image(data: userService.user.imageData, placeholder: "nameOfPlaceholder")
由于它不可
为空
,因此它不需要包含在另一个
视图
中,至少还有一个
视图