三元运算符未正确处理零数据

时间:2019-11-12 17:40:05

标签: swift

我有一个来自API请求的JSON对象,该对象代表文章列表。这些文章可能有也可能没有特色图片,因此我将其存储为可选值。我有一个采用可选URL字符串并将其转换为UIImage的类,但是,当变量为nil时,这将崩溃。为了解决这个问题,我在崩溃的行上使用了三元运算符,告诉它在nil值的情况下使用另一个图像,但是,这似乎不起作用,因为该应用程序仍然崩溃。我试图在if语句中包装调用此ImageLoader类的行,以便即使有nil值也不允许它被调用,但这也不起作用。似乎对nil的检查永远不会返回true,因此崩溃不可避免地发生。

List (articlesVM.entries) { entry in
  Text(entry.title!)
    .padding(15)
  if entry.visual?.url != nil {
    ImageViewWidget(imageUrl: entry.visual!.url!)
  }else {
    Image("apple")
  }
}

这是该班级的初学者。如果url为nil,则此if语句应阻止调用,但是仍然可以顺利通过。

class ImageLoader: ObservableObject {
  var didChange = PassthroughSubject<Data, Never>()    
  var data = Data() {
    didSet{
      didChange.send(data)
    }
  }    
  init(imageUrl: String) {
    // fetch image data and then call didChange
  }
}

struct ImageViewWidget: View {    
  @ObservedObject var imageLoader: ImageLoader
  init(imageUrl: String) {
    imageLoader = ImageLoader(imageUrl: imageUrl)
    print(imageLoader.data)
  }    
  var body: some View {
    Image(uiImage: (imageLoader.data.count == 0) ? UIImage(named: "apple")! : UIImage(data: 
    imageLoader.data)!)  // This also does not check for nil properly
  }
}

这是实际的ImageLoader类,从ImageViewWidget的注释中可以看到,三元运算符也未能正确说明nil。

为什么两种不同形式的nil检查无法正确捕获该nil值的可选变量,我如何确保它们可以呢?

1 个答案:

答案 0 :(得分:0)

您正在检查imageLoader的数据是否等于nil,但是其类型为Data而不是Data?,即不是可选的,因此永远不会为nil。因此,三进制永远不会返回true,因此,无论是否存在imageLoader数据,它总是会尝试加载。

此外,我希望但由于代码不存在而无法分辨,获取图像的代码将是异步的,因此永远不会及时保存图像数据以供使用。

您需要重新考虑图像加载的逻辑和流程。