2015-06-26 5 views
46

Ich entwickle gerade meine erste iOS App mit Swift 2.0 und Xcode Beta 2. Es liest einen externen JSON und erzeugt eine Liste in einer Tabellenansicht mit den Daten. Aber ich bin einen seltsamen kleinen Fehler bekommen, dass ich nicht zu beheben scheine:Swift: Zusätzliches Argument 'error' in call

Extra argument 'error' in call 

Hier ein Ausschnitt aus meinem Code ist:

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() 
        }) 
       } 
      } 
     }) 

Der Fehler bei dieser Linie geworfen wird:

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

Kann mir bitte jemand sagen, was ich hier falsch mache?

+0

Diese Zeile gibt diesen Fehler nicht, ich denke, dass Sie in andere Zeile kommen. –

+0

Mit 2.0 müssen Sie einen 'do'' catch' Block erstellen. 'error' ist kein Parameter mehr mit' NSJSONSerialization'. Auf diese Frage gibt es eine Reihe anderer Antworten. Suchen Sie nach, fangen Sie mit Swift 2.0 –

Antwort

75

Mit Swift 2, die Unterschrift für NSJSONSerialization geändert hat, auf die neue Fehlerbehandlungssystem anzupassen.

Hier ist ein Beispiel dafür, wie es zu benutzen:

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

Mit Swift 3, der Name von NSJSONSerialization und ihre Methoden geändert haben, nach the Swift API Design Guidelines.

Hier ist das gleiche Beispiel:

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

Ich benutze Swift 2.2 und versuchte Ihre erste Version.Es kompiliert korrekt, aber es stirbt lautlos, trifft keine der 'Print'-Zeilen. Wenn ich den 'if' Teil vor' jsonResult' entferne und laufe, kann ich daraus schließen, dass das jsonResult als 'nil' ohne Fehler gesetzt ist. Ich bin sicher, dass die Daten als eine gültige JSON-Zeichenfolge beginnt ... –

+1

@jeffery_the_wind Ihre JSON ist wahrscheinlich anders als Sie denken. Versuchen Sie Folgendes: http://stackoverflow.com/a/33510776/2227743 – Moritz

+1

Danke, ja das wars! Ersetzen von 'wie? NSDictionary 'mit' as? NSArray in Ihrem ersten Beispiel funktioniert für mich. –

5

Dinge in Swift 2 geändert haben, Methoden, die ein error Parameter akzeptiert wurden in Verfahren transformiert, die diesen Fehler zu werfen, statt sie über einen inout Parameter zurück. Mit Blick auf den Apple documentation:

HANDLING FEHLER IN SWIFT: In Swift, gibt diese Methode ein nicht-optionales Ergebnis und markiert mit dem Schlüsselwort wirft, um anzuzeigen, dass es einen Fehler bei Störungen führt.

Sie rufen diese Methode in einem try-Ausdruck auf und behandeln alle Fehler in den catch-Klauseln einer do-Anweisung, wie in Fehlerbehandlung in der Swift-Programmiersprache (Swift 2.1) und Fehlerbehandlung in Swift mit Cocoa und Objective beschrieben. C (Schnell 2.1).

Die kürzeste Lösung wäre try? zu verwenden, die nil zurück, wenn ein Fehler auftritt:

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)") 
} 
:

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

Wenn Sie auch Interesse in den Fehler sind, können Sie eine do/catch verwenden

+0

Das hat bei Swift 2.2 funktioniert – swiftBoy

0

Dies wurde in Swift 3.0 geändert.

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)") }