2015-06-14 13 views
16

ho qualche (brutto) codice di auto-scritto portato su Swift2 ed ho ottenuto questo messaggio di errore in una funzione lambda:Swift 2: la conversione non valida dal funzione del tipo di lancio per la funzione non-lancio

function with error

Quello che non ho capito è che gestisco l'intero codice con la funzione di lancio degli errori JSONObjectWithData e capisco l'errore. Non lancio nulla nel codice. Tuttavia il compilatore significa che sto generando un errore.

Ho bisogno di capire questo comportamento. Per favore sii gentile perché so che devo migliorare il mio codice per sfruttare appieno il nuovo concetto di gestione degli errori in swift2.

Grazie mille in anticipo.

risposta

36

Questo è stato veloce. Ho calcolato la soluzione per il mio problema con un piccolo aiuto di questo articolo:

http://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

devi mettere una clausola generale di cattura alla fine del codice in quanto la cattura di NSError sola non è sufficiente.

catch let error as NSError 
{ 
    failure(error: error) 
    return 
} 

// this is important --> 
catch 
{ 
} 
+0

Perché pensi che Apple abbia reso 'catch' esaustivo con Swift 2, quando non abbiamo nemmeno provato a provare e a prendere in Swift 1/1.2? – rb612

+1

Non è necessario rilevare l'errore in modo specifico. Ci dovrebbe essere un riferimento di errore disponibile nel blocco generale. –

+1

Ciao Jon, potresti darmi un esempio, come posso usare il riferimento all'errore nel blocco generale ?. Grazie – ChaosSpeeder

3

Penso che il modo migliore di procedere è quello di cambiare la vostra funzione mancata firma di prendere un ErrorType. Quindi solo

catch let error { 
    failure(error: error) 
} 

farà.

+0

Quando si utilizza l'API Apple, potrebbe essere preferibile trasmettere l'errore a NSError in quanto i metodi Apple tendono a lanciare un oggetto NSError. Gli oggetti NSError di Apple contengono ulteriori dettagli sull'errore che si è verificato, a cui si accede in proprietà specifiche di NSError quali .localizedDescription e .userInfo. "JSONObjectWithData" dal commento del poster originale genera un oggetto NSError. Anche i metodi CoreData generano oggetti NSError. Preferisco trasmettere l'errore a NSError da INSIDE il blocco catch in modo che la cattura sia completa. – ObjectiveTC

Problemi correlati