我有一个来自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值的可选变量,我如何确保它们可以呢?
答案 0 :(得分:0)
您正在检查imageLoader的数据是否等于nil,但是其类型为Data
而不是Data?
,即不是可选的,因此永远不会为nil。因此,三进制永远不会返回true,因此,无论是否存在imageLoader数据,它总是会尝试加载。
此外,我希望但由于代码不存在而无法分辨,获取图像的代码将是异步的,因此永远不会及时保存图像数据以供使用。
您需要重新考虑图像加载的逻辑和流程。