2015-06-26 11 views
46

Attualmente sto sviluppando la mia prima app per iOS utilizzando Swift 2.0 e Xcode Beta 2. Legge un JSON esterno e genera un elenco in una visualizzazione tabella con i dati. Tuttavia, sto diventando un piccolo errore strano che non riesco a risolvere:Swift: argomento aggiuntivo 'errore' nella chiamata

Extra argument 'error' in call 

Ecco un frammento del mio codice:

let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in 
      print("Task completed") 

      if(error != nil){ 
       print(error!.localizedDescription) 
      } 

      var err: NSError? 

      if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{ 

       if(err != nil){ 
        print("JSON Error \(err!.localizedDescription)") 
       } 

       if let results: NSArray = jsonResult["results"] as? NSArray{ 
        dispatch_async(dispatch_get_main_queue(), { 
         self.tableData = results 
         self.appsTableView!.reloadData() 
        }) 
       } 
      } 
     }) 

L'errore è gettato in questa linea:

if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{ 

Qualcuno può dirmi per favore cosa sto facendo male qui?

+0

Questa riga non fornisce questo errore, penso che potrebbe essere in linea diversa. –

+0

Con 2.0 è necessario creare un blocco 'do'' catch'. 'error' non è più un parametro con' NSJSONSerialization'. Ci sono un certo numero di altre risposte a questa domanda qui. Cerca di fare, cattura con Swift 2.0 –

risposta

75

Con Swift 2, la firma per NSJSONSerialization è cambiato, per conformarsi al nuovo sistema di gestione degli errori.

Ecco un esempio di come usarlo:

do { 
    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary { 
     print(jsonResult) 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

Con Swift 3, il nome di NSJSONSerialization e dei suoi metodi sono cambiati, secondo the Swift API Design Guidelines.

Ecco lo stesso esempio:

do { 
    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] { 
     print(jsonResult) 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 
+0

Sto usando swift 2.2 e ho provato la tua prima versione.Si sta compilando correttamente ma sta morendo in silenzio, non ha colpito nessuna delle righe 'print'. Quando rimuovo la parte 'if' di fronte a' jsonResult' ed eseguo, posso dedurre che jsonResult viene impostato come 'nil' senza errori. Sono sicuro che i dati inizino come una stringa json valida ... –

+1

@jeffery_the_wind Il tuo JSON è probabilmente diverso da quello che pensi. Prova questo: http://stackoverflow.com/a/33510776/2227743 – Moritz

+1

Grazie, sì è stato! Sostituendo 'come? NSDictionary' con 'as? NSArray' nel tuo primo esempio funziona per me. –

5

Le cose sono cambiate a Swift 2, metodi che accettano un parametro error sono stati trasformati in metodi che gettano tale errore invece di restituire tramite un parametro inout. Osservando la Apple documentation:

Gestione degli errori a Swift: In Swift, questo metodo restituisce un risultato nonoptional ed è contrassegnato con la tiri parola chiave per indicare che si genera un errore in caso di fallimento.

Si chiama questo metodo in un'espressione try e si gestiscono eventuali errori nelle clausole catch di un'istruzione do, come descritto in Gestione degli errori in Swift Programming Language (Swift 2.1) e Gestione degli errori in Uso di Swift con Cocoa e Objective- C (Swift 2.1).

La soluzione più breve sarebbe quella di utilizzare try? che restituisce nil se si verifica un errore:

let message = try? NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments) 
if let dict = message as? NSDictionary { 
    // ... process the data 
} 

Se siete interessati nell'errore anche, è possibile utilizzare un do/catch:

do { 
    let message = try NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments) 
    if let dict = message as? NSDictionary { 
     // ... process the data 
    } 
} catch let error as NSError { 
    print("An error occurred: \(error)") 
} 
+0

Questo ha funzionato per me su Swift 2.2 – swiftBoy

0

Questo è stato modificato in Swift 3.0.

do{ 
      if let responseObj = try JSONSerialization.jsonObject(with: results, options: .allowFragments) as? NSDictionary{ 

       if JSONSerialization.isValidJSONObject(responseObj){ 
        //Do your stuff here 
       } 
       else{ 
        //Handle error 
       } 
      } 
      else{ 
       //Do your stuff here 
      } 
     } 
     catch let error as NSError { 
       print("An error occurred: \(error)") } 
Problemi correlati