2016-06-12 4 views
0

Ich habe diesen seltsamen Fehler, wenn ich versuche, JSON zu parsen. Ich mache einen API-Aufruf über einen asynchronen Aufruf zu bekommen Städte Slug, mit einem Abschluss-Handler:versuchen, JSON zu analysieren, erhalten Fehler: Verwendung von undeclared Typ 'Foundation'

//Load cities slug via api call 
     let apiCall : webApi = webApi() 

     apiCall.loadCitySlugs(){(success) in 
      //Slug loaded in background 
      //Call google api to compare the slug 
      apiCall.compareSlugFromGoogleApi()  

In der Funktion compareSlugFromGoogleApi() gibt es einige Konfigurations Dinge wie die URL des Asynchron-Aufrufs, den Post params, also nichts wirklich relevant, außer der Asynchron-Anruffunktion:

/** 
Simple async call. Returns json NSMutableArray as AnyObject 
*/ 
func asyncCall(url : String, completed : complHandlerAsyncCall)/* -> AnyObject*/{ 

    //Set async call params 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    request.HTTPMethod = "POST" 

    request.HTTPBody = postParam.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     guard error == nil && data != nil else { 
      // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 
     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { 
      // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
     } 


     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 

     asyncJson = responseString?.parseJSONString as! NSMutableArray 

     flagAsyncCall = true // true if download succeed,false otherwise 

     completed(success: flagAsyncCall!) 

    } 
    task.resume() 
    //return json! as AnyObject 
} 

In der Asynchron-Anruffunktion, rufe ich zu einer Verlängerung parseJSONString, die ein jSON-Objekt einfach zu analysieren zurück:

extension NSString 
{ 
    var parseJSONString: AnyObject? 
    { 
     let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 

     if let jsonData = data 
     { 
      // Will return an object or nil if JSON decoding fails 
      do 
      { 
       let message = try NSJSONSerialization.JSONObjectWithData(jsonData, options:.MutableContainers) 
       if let jsonResult = message as? NSMutableArray 
       { 

        return jsonResult //Will return the json array output 
       } 
       else 
       { 
        return nil 
       } 
      } 
      catch let error as NSError 
      { 
       print("An error occurred: \(error)") 
       return nil 
      } 
     } 
     else 
     { 
      // Lossless conversion of the string was not possible 
      return nil 
     } 
    } 
} 

Und hier habe ich ein Problem mit dem Google-Anruf. Alles sieht mehr oder weniger in Ordnung, aber es gibt einen Nullwert aus der Verlängerung und dann wieder in dem Asynchron-Anruf, es wirft mir diesen Fehler:

enter image description here

noch das Response-Objekt ist nicht leer:

enter image description here

+0

Warum deklarieren Sie die berechnete Variable 'parseJSONString' als' AnyObject', obwohl bei Erfolg immer 'NSMutableArray' zurückgegeben wird? Das starke Konzept von Swift empfiehlt dringend, so spezifisch wie möglich zu sein. – vadian

+0

weil sonst kann ich keinen Nil-Wert zurückgeben. Nil ist nicht kompatibel mit Rückgabetyp NSMutableArray.Ich habe es getan, wie Sie sagten, aber es ist das gleiche. Ich muss NSMutableArray optional (?) – user3033437

+0

deklarieren Verwenden Sie native Swift-Auflistungstypen. Sie machen die Dinge viel einfacher. – vadian

Antwort

-1

Verwenden NSDictionary statt NSMutableArray.

+0

es analysiert nicht einmal den ersten JSON mit NSMutableDictionary – user3033437

+0

@ user3033437 Mein Fehler - sollte NSDictionary sein. Bitte versuche es erneut. – Code

+0

Danke, und übrigens, ich bin es nicht, wer deine Antwort abgelehnt – user3033437

0

Es wirft einen Fehler, weil parseJSONString Nil zurückgibt, und wenn Sie das ! auspacken, stürzt es ab. Sie sollten prüfen, ob parseJSONString nicht null zurückgibt. if let parsed = parseJSONString { do something }

+0

ja, aber warum es Nil in einem guten JSON wirft? – user3033437

Verwandte Themen