2016-08-10 2 views
0

Ich versuche, ein do zu tun, versuchen Sie, wie so fangen:swift versuchen fangen funktioniert nicht

do { 
    setQA = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject] 
    print(setQA) 
} 
catch _ { 
    setQA = nil 
    self.customAlert("Error") 
} 

und ich versuche, eine Methode aufrufen UIAlertController zu verwenden, aber es reicht nie.

Dies wird durch den Versuch, meine app stürzt mit diesem Fehler auch dann nicht erhalten:

Could not cast value of type '__NSCFDictionary' (0x1a1773968) to 'NSArray' 

dies einen erwarteten Fehler ist auf Benutzerdaten, die manchmal fehlen noch auftreten werden, ich nicht nur meine App und nur zum Absturz Anzeige der Warnung

+0

Es scheint, dass das äußerste Objekt in Ihrem JSON ein Wörterbuch ist, kein Array. Sie können eine bedingte downcast verwenden, aber das wird immer noch nicht werfen, es wird nur geben nil für setQA – Paulw11

+0

Wie mache ich das @ Paulw11 – user979331

+0

'[String: AnyObject]' –

Antwort

1

do/try/catch fangen Fehler ab, die von einer anderen Methode ausgelöst werden, aber es werden keine Laufzeitausnahmen abgefangen, die Sie beispielsweise aus der erzwungenen Abwärtsumwandlung erhalten. Wenn beispielsweise data ungültiger JSON ist, wird ein Fehler ausgelöst und abgefangen. In Ihrem Fall scheint der JSON gültig zu sein, aber es ist ein Wörterbuch, kein Array.

Sie wollen so etwas wie

setQA = nil 
do { 
    if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject] { 
     setQA = json 
     print(setQA) 
    } else { 
     self.customAlert("Invalid response from server") 
    } 
} catch _ { 
    self.customAlert("Error parsing JSON") 
} 
1

Eigentlich ist dies aus diesem Teil des Codes kommen:

JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject] 

Was können Sie tun, ist so etwas wie das:

  1. Erste Kontrolle Wenn Sie tatsächlich einige Daten von Ihrem Server erhalten haben:
  2. Überprüfen Sie das Format dieser Daten. Ihr Code stürzt ab, weil er versucht, Ihren JSON in ein falsches Format (hier ein Array von Objekten) zu parsen. Versuchen Sie daher, alle möglichen Fälle zu behandeln.

Ergebnis Code würde wie folgt sein:

if let realData = data as? Data{ 

      do { 
        if let setQA = try NSJSONSerialization.JSONObjectWithData(realData, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject] { 
         //Check if the result is an Array 
        print(setQA) 
        }else if setQA = try NSJSONSerialization.JSONObjectWithData(realData, options: NSJSONReadingOptions.AllowFragments) as? [String : AnyObject] { 
         //Check if the result is a dictionnary 
        } 
       } 
       catch _ { 
        setQA = nil 
        self.customAlert("Error") 
       } 

      }else{ 
       //Check if you have at least some data 
       self.customAlert("No data from server :(") 
      } 
} 

In der Regel versuchen die Verwendung von zu vermeiden! ;)