我正在尝试使用if语句检查是否存在url图像。然而,当试图通过错误的图像url测试它时,它会继续返回:
致命错误:在解包可选值时意外发现nil。
代码:
var httpUrl = subJson["image_url"].stringValue
let url = NSURL(string: httpUrl)
let data = NSData(contentsOfURL: url!)
if UIImage(data: data!) != nil {
}
答案 0 :(得分:6)
你可以这样做:
var httpUrl = subJson["image_url"].stringValue
if let data = NSData(contentsOfURL: url) {
//assign your image here
}
答案 1 :(得分:6)
其他答案告诉您打开可选项,但实际问题是您强制 - 使用!
包裹可选项,尽管它是nil
。< / p>
当您写下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组合在一起意味着您无法告诉哪一个失败,所以您可能希望将它们分解为单独的语句。
答案 2 :(得分:2)
此代码经过测试并成功:如果图片网址不存在则不会崩溃。
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)
}
答案 3 :(得分:1)
您必须打开这样的选项:
if let image = data {
// use image here
} else {
// the data is nil
}