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:
noch das Response-Objekt ist nicht leer:
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
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
deklarieren Verwenden Sie native Swift-Auflistungstypen. Sie machen die Dinge viel einfacher. – vadian