Swift guard检查nil文件 - 意外地发现没有

时间:2018-06-13 03:40:08

标签: swift optional guard

我正在尝试使用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语句会崩溃?

1 个答案:

答案 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)!