我正在尝试使用guard语句检查此文件是否可用。
guard UIImage(contentsOfFile: Bundle.main.path(forResource: imageName, ofType: "png")!) != nil else {
print("\(imageName).png file not available")
return
}
但是我在保护线上遇到了崩溃:
致命错误:在解包可选值时意外发现nil
imageName
不是可选的。它是一个带值的String。
nil
正是我想要测试的,为什么guard
语句会崩溃?
答案 0 :(得分:4)
结合guard
和强制展开是一种矛盾。 guard
的一个常见用途是guard let
,它可以安全地防范nil
,并且无需强制解包。
我会将您的代码重做为:
guard let imagePath = Bundle.main.path(forResource: imageName, ofType: "png"), let image = UIImage(contentsOfFile: imagePath) else {
print("\(imageName).png file not available")
return
}
// Use image here as needed
如果您实际上不需要图像,但只是想确保可以创建图像,则可以将其更改为:
guard let imagePath = Bundle.main.path(forResource: imageName, ofType: "png"), UIImage(contentsOfFile: imagePath) != nil else {
print("\(imageName).png file not available")
return
}
说完所有这些,如果图片实际上应该在您的应用包中,并且它只是一个临时问题,例如忘记正确定位文件,那么就不要使用后卫并继续使用-unwrap。您希望应用程序在开发过程中尽早崩溃,以便解决问题。
let image = UIImage(contentsOfFile: Bundle.main.path(forResource: imageName, ofType: "png")!)!
最后一件事。您可以使用以下方式更轻松地获取图像:
let image = UIImage(named: imageName)!