2015-04-30 38 views
6

Sto provando a controllare se esiste un'immagine di url usando un'istruzione if. Tuttavia quando si cerca di testarlo dal sbagliato url immagine che continuano a tornare:Verifica se l'immagine dell'URL esiste

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

codice:

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

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

Questa è una caratteristica di base del linguaggio Swift. È necessario scaricare seriamente i libri Swift dal bookstore Apple e leggerli. Quando scrivi url! significa "per favore arresti se url è nullo". – gnasher729

risposta

5

si può fare in questo modo:

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

    //assign your image here 
} 
+0

è compatibile con Swift 2? Ricevo reclami: Uso dell'identificatore non risolto: subJson. – BigBoy1337

+0

Swift 3 e 4 è diverso, quindi le righe "if let data = NSData (contentsOfURL: url) {...}" devono essere sostituite con: "do {let data = try Data (contentsOf: url) ... } catch {...} " – gepree

1

Bisogna scartare l'opzione in questo modo:

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

Altro rispondere rs ti sta dicendo di scartare l'opzionale, ma in realtà il problema è che sei forza -avvolgimento del facoltativo con !, nonostante sia nil.

Quando si scrive something! quello che stai dicendo è “something potrebbe essere nil, ma se lo è, io voglio che il mio crash del programma”.

Il motivo per cui una chiamata potrebbe restituire nil è se il risultato non è valido, ad esempio se si tenta di recuperare una chiave da un dizionario che non è presente o che un URL non punta a un download valido Immagine.

È possibile combinare il controllo per nil con una dichiarazione if che decompone l'opzionale e restituisce un valore non facoltativo purché il valore non sia nil. È inoltre possibile concatenare insieme, quindi se avete bisogno di scartare un valore, quindi passare in una chiamata che restituisce anche un optional, si può fare tutto in una if dichiarazione:

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 
} 

nota, il primo linea, la chiamata è a .string anziché .stringValue - .string restituisce anche un optional con nil se il valore non è presente.

Ovviamente, la combinazione di tutti questi scartini insieme significa che non è possibile dire a quale uno non riuscito, quindi è possibile che si desideri suddividerli in istruzioni separate.

1

Questo codice è stato testato e superato: se l'URL dell'immagine non esiste, non si verifica un arresto anomalo.

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

In Swift 3 e 4 raccomando l'uso di URL e dati (invece di NSURL e NSData). Ad esempio: if let url = URL (string: "http://www.example.com/images/image.png") { do { let data = prova Data (contentsOf: url) se let image = UIImage (dati: dati) { stampa ("*** \ (image)") } } cattura { stampa (errore) } } – gepree