2015-04-07 11 views
6

Ich habe diese guide gefunden, um eine HTTP-Nachricht zu empfangen, die eine JSON-formatierte Fehlermeldung mit AFNetworking 2 enthält. Die Anleitung ist in Objective-C und ich versuche mein Bestes, um es in Swift umzuwandeln.Konvertieren von MutableCopy zu Swift

Hier ist der Code, den ich in Swift zu konvertieren bin versucht:

- (id)responseObjectForResponse:(NSURLResponse *)response 
          data:(NSData *)data 
          error:(NSError *__autoreleasing *)error { 
    if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { 
     if (*error != nil) { 
      NSMutableDictionary *userInfo = [(*error).userInfo mutableCopy]; 
      NSError *jsonError; 
      // parse to json 
      id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; 
      // store the value in userInfo if JSON has no error 
      if (jsonError == nil) userInfo[JSONResponseSerializerWithDataKey] = json; 
      NSError *newError = [NSError errorWithDomain:(*error).domain code:(*error).code userInfo:userInfo]; 
      (*error) = newError; 
     } 
     return (nil); 
    } 
    return ([super responseObjectForResponse:response data:data error:error]); 
} 

Speziellere es ist dieser Teil das Problem gibt es:

NSMutableDictionary *userInfo = [(*error).userInfo mutableCopy]; 

Dies ist meine aktuellen Code:

class JSONResponseSerializerWithData: AFJSONResponseSerializer { 

    let JSONResponseSerializerWithDataKey: NSString = "JSONResponseSerializerWithDataKey" 

    override func responseObjectForResponse(response: NSURLResponse!, 
     data: NSData!, 
     error: NSErrorPointer) -> AnyObject? { 
      if(!self.validateResponse(response as NSHTTPURLResponse, data: data, error: error)) { 

       if(error != nil) { 
        // The question..... 

        var jsonError: NSError 
        // parse to json 

        // Missing some returns with AnyObejct... 
       } 

      return nil 
     } 
    } 
} 

Wie konvertiere ich diese Zeile in Swift? Ich bin ziemlich neu in der Swift/Objective-C-Sprache, also könnte es eine einfache Lösung dafür geben, aber ich konnte sie noch nicht finden.

Antwort

1

ich die gleiche Anleitung gefunden, die beschreibt, wie Fehlermeldung in AFNetworking 2 und hier ist meine Implementierung in Swift analysieren:

override func responseObjectForResponse(response: NSURLResponse!, data: NSData!, error: NSErrorPointer) -> AnyObject! { 
     if !self.validateResponse(response as! NSHTTPURLResponse, data: data, error: error) { 
      if error != nil { 
       var userInfo = error.memory!.userInfo! 
       var jsonError:NSError? 

       let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: &jsonError) 
       userInfo[JSONResponseSerializerWithDataKey] = json; 
       error.memory = NSError(domain: error.memory!.domain, code: error.memory!.code, userInfo: userInfo) 

      } 
      return nil 
     } 

     return super.responseObjectForResponse(response, data: data, error: error) 
    } 

Hoffnung Das wird jemandem helfen.

+0

Und es funktioniert wie es sollte? –

+0

Es funktioniert Michael, ich benutze es in meiner neuesten App. Versuch es selber. Lassen Sie mich wissen, wenn Sie irgendwelche Probleme damit haben ... – Borbea

+0

Funktioniert hier auch! Du hast die Frage richtig beantwortet! : D –

3

Ich denke, das den Trick tun sollten:

var userInfo = error.userInfo 
+3

Wichtig zu beachten, dass dies funktioniert, da ein Dictionary in swift eine Struktur ist, die kopiert wird, wenn sie zugewiesen wird, anstatt eine Klassentypinstanz, die kopiert werden muss (mit copy()), um das gewünschte Ergebnis zu erhalten) – giorashc

+0

@gorashc Ahh! Danke, dass du darauf hingewiesen hast. Ein weiterer Grund, warum ich mehr über die Verwendung von struct lesen sollte. Das einzige Problem, das ich jetzt habe, ist ein "NSErrorPointer" hat kein Mitglied namens "userInfo". Ist das mit der Swift-Konvertierung oder einem Fehler in meinem Code verbunden? –

+1

beachten Sie, dass Fehler ein Doppelzeiger ist, so dass Sie es zweimal deaktivieren müssen, um die Instanz zu erreichen. dh '* (* error) .userInfo' – giorashc

Verwandte Themen