2015-04-30 3 views
6

Я пытаюсь проверить, существует ли изображение url с использованием оператора if. Однако при попытке проверить его неправильным URL изображения он снова и снова возвращаются:Проверьте, существует ли изображение URL-адреса

fatal error: unexpectedly found nil while unwrapping an Optional value.

код:

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

if UIImage(data: data!) != nil { 
} 
+1

Это основная особенность языка Swift. Вам нужно серьезно загрузить книги Swift из книжного магазина Apple и прочитать их. Когда вы пишете URL! это означает, что «пожалуйста, сбой, если URL-адрес равен нулю». – gnasher729

ответ

5

Вы можете сделать это таким образом:

var httpUrl = subJson["image_url"].stringValue 
if let data = NSData(contentsOfURL: url) { 

    //assign your image here 
} 
+0

этот быстрый 2 совместимый? Я получаю жалобы: использование неразрешенного идентификатора: subJson. – BigBoy1337

+0

Swift 3 и 4 отличается, и поэтому строки if if data = NSData (contentsOfURL: url) {...} "должны быть заменены на:" do {let data = try Data (contentsOf: url) ... } catch {...} " – gepree

1

Вы должны разворачивать опциональный так:

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

Другие answe rs говорят вам разворачивать факультативный вариант, но на самом деле проблема в том, что вы force -объем дополнительного с !, несмотря на то, что он 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 
} 

Примечания, на первом line, вызов равен .string, а не .stringValue - .string также возвращает необязательный номер с nil, если его значение отсутствует.

Конечно, объединение всех этих разворот вместе означает, что вы не можете сообщить , что не удалось, поэтому вы можете разбить их на отдельные заявления.

1

Этот код проверен и удалён: если 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) 
    } 
+0

В Swift 3 и 4 я бы рекомендовал использовать URL и данные (вместо NSURL и NSData). Например: if let url = URL (строка: «http://www.example.com/images/image.png») { do { let data = try Данные (содержимоеOf: url) if let image = UIImage (данные: данные) { print ("*** \ (image)") } } catch { Печать (ошибка) } } – gepree

Смежные вопросы