2015-06-26 13 views
46

Obecnie tworzę swoją pierwszą aplikację na iOS za pomocą Swift 2.0 i Xcode Beta 2. Odczytuje zewnętrzny JSON i generuje listę w widoku tabeli z danymi. Jednak Dostaję dziwny mały błąd, że nie może wydawać się to naprawić:Swift: Dodatkowy argument "błąd" w wywołaniu

Extra argument 'error' in call 

Oto fragment mojego kodu:

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

Błąd jest wyrzucane na tej linii:

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

Czy ktoś może mi powiedzieć, co robię źle tutaj?

+0

Ta linia nie podaje tego błędu, myślę, że możesz dostać się w inną linię. –

+0

W wersji 2.0 należy utworzyć blok catch 'do'' catch'. 'error' nie jest już parametrem z' NSJSONSerialization'. Jest tu wiele innych odpowiedzi na to pytanie. Poszukaj, złap się Swift 2.0 –

Odpowiedz

75

Z Swift 2, z podpisu dla NSJSONSerialization uległa zmianie, w celu dostosowania się do nowego systemu obsługi błędów.

Oto przykład, w jaki sposób z niego korzystać:

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

Z Swift 3 The nazwa z NSJSONSerialization i jej metody zostały zmienione zgodnie z the Swift API Design Guidelines.

Oto sam przykład:

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

Używam Swift 2.2 i wypróbowałem twoją pierwszą wersję.Kompiluje się poprawnie, ale umiera w milczeniu, nie trafia w żadną z linii 'print'. Kiedy usunę część 'if' przed' jsonResult' i uruchomię, mogę wywnioskować, że jsonResult jest ustawiony jako 'zerowy' bez błędów. Jestem pewien, że dane zaczynają się od prawidłowego ciągu jsonów ... –

+1

@jeffery_the_wind Twój JSON jest prawdopodobnie inny niż myślisz. Spróbuj tego: http://stackoverflow.com/a/33510776/2227743 – Moritz

+1

Dzięki, tak, to było to! Zastępujesz "jak? NSDictionary' with 'as? NSArray' w twoim pierwszym przykładzie działa dla mnie. –

5

Wiele się zmieniło w Swift 2, metody, które przyjął parametr error zostały przekształcone metodami, które rzucają ten błąd zamiast zwrócić go za pomocą parametru inout. Patrząc na Apple documentation:

obsługi błędów w systemie SWIFT: w Swift, metoda ta zwraca nonoptional wynik i jest oznaczony rzuca słowa kluczowego, aby wskazać, że zgłasza błąd w przypadkach awarii.

Wywołujesz tę metodę w wyrażeniu try i obsługujesz wszelkie błędy w klauzulach catch instrukcji a do, jak opisano w Objaśnianiu błędów w Swift Programming Language (Swift 2.1) i obsłudze błędów przy użyciu Swift z kakao i Objective C (Swift 2.1).

Najkrótsza rozwiązaniem byłoby wykorzystanie try? która zwraca nil jeśli wystąpi błąd:

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

Jeśli jesteś zainteresowany również do błędu, można użyć 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

To działało dla mnie na Swift 2.2 – swiftBoy

0

Zostało to zmienione w 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)") } 
Powiązane problemy