Vorrei creare una funzione in Swift 2 che recuperi i dati da un URL e li restituisca come un oggetto JSON utilizzando NSURLSession. All'inizio, questo sembrava abbastanza semplice. Ho scritto quanto segue:In Swift 2, come posso restituire gli errori di analisi JSON al blocco di completamento?
func getJson(url:NSURL, completeWith: (AnyObject?,NSURLResponse?,NSError?)->Void) -> NSURLSessionTask? {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url) {
(data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if error != nil {
completeWith(nil, response, error)
}
if let data = data {
do {
let object:AnyObject? = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
} catch let caught as NSError {
completeWith(nil, response, caught)
}
completeWith(object, response, nil)
} else {
completeWith(nil, response, error)
}
}
return task
}
Tuttavia, ciò non viene compilato perché il blocco di completamento non dichiara "getta". L'errore esatto è Cannot invoke 'dataTaskWithURL' with an argument list of type '(NSURL, (NSData?, NSURLResponse?, NSError?) throws -> Void)'
. Anche se sto rilevando tutti gli errori nella mia istruzione do/catch
, Swift vuole ancora propagare il NSError sulla catena. L'unico modo che posso vedere in giro è quello di utilizzare try!
, in questo modo:
if let data = data {
let object:AnyObject? = try! NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
completeWith(object, response, nil)
} else {
completeWith(nil, response, error)
}
Ora tutto compila bene, ma ho perso la NSError che è gettato da NSJSONSerialization.JSONObjectWithData
.
È stato possibile catturare il NSError potenzialmente lanciato da NSJSONSerialization.JSONObjectWithData
e propagarlo al blocco di completamento senza modificare la firma del blocco di completamento?
Ciao. Quando provo questa risposta, ottengo uno strano errore usando Xcode 7 Beta 2. "'AnyObject' non è convertibile in 'AnyObject'". Non sono sicuro se questo è solo un problema di Xcode Beta, o no. Qualcun altro ha qualche problema con il blocco di codice sopra? – jguffey