检查url图像是否存在

我正在尝试使用if语句检查是否存在url图像。 但是,当尝试通过错误的图像url测试它时,它会继续返回:

致命错误:在展开Optional值时意外发现nil。

码:

var httpUrl = subJson["image_url"].stringValue let url = NSURL(string: httpUrl) let data = NSData(contentsOfURL: url!) if UIImage(data: data!) != nil { } 

你可以这样做:

 var httpUrl = subJson["image_url"].stringValue if let data = NSData(contentsOfURL: url) { //assign your image here } 

其他答案告诉你解开可选的,但问题是你强制 –包装可选的! ,尽管它是nil

当你写something! 你所说的是“ something可能是nil ,但如果是,我希望我的程序崩溃”。

调用可能返回nil的原因是结果无效 – 例如,如果您尝试从不存在的字典中获取密钥,或者URL未指向有效的可下载映像。

您可以将对nil的检查与展开可选项的if语句结合使用,并返回非可选值,只要该值不是nil 。 您也可以将它们链接在一起,因此如果您需要解包值,然后将其传递给也返回可选项的调用,您可以在一个if语句中执行所有操作:

 if let httpUrl = subJson["image_url"].string, url = NSURL(string: httpUrl), data = NSData(contentsOfURL: url), image = UIImage(data: data) { // use image value } else { // log some error } 

注意,在第一行,调用是.string而不是.stringValue.string如果值不存在,也会返回带有nil的可选项。

当然,将所有这些unwraps组合在一起意味着你无法分辨一个失败,所以你可能想要将它们分解为单独的语句。

你必须像这样解开可选项:

 if let image = data { // use image here } else { // the data is nil } 

此代码已经过测试并且成功:如果图像url不存在则不会崩溃。

 let url: NSURL = NSURL(string: "http://www.example.com/images/image.png")! do { let imgData = try NSData(contentsOfURL: url, options: NSDataReadingOptions()) ImageView?.image = UIImage(data: imgData) } catch { print(error) }