2015-04-07 15 views
6

Znalazłem to guide, aby otrzymać treść HTTP, zawierającą komunikat o błędach sformatowany w JSON z AFNetworking 2. Przewodnik jest w Objective-C i próbuję z mojej strony, jak najlepiej, przekonwertować go na Swift.Konwersja mutableCopy na Swift

Oto kod próbuję przekształcić Swift:

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

Bardziej szczegółowe to ta część nie jest problem:

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

To jest mój bieżący kod:

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

Jak przekonwertować tę linię na Swift? Jestem całkiem nowy w języku Swift/Objective-C, więc może to być proste rozwiązanie, ale nie udało mi się go jeszcze znaleźć.

Odpowiedz

1

znalazłem ten sam przewodnik, który opisuje jak analizować komunikat o błędzie w AFNetworking 2 i tu jest moja implementacja w Swift:

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

Nadzieja to pomoże komuś.

+0

I działa tak jak powinien? –

+0

Działa Michael, używam go w mojej najnowszej aplikacji. Spróbuj sam. Daj mi znać, jeśli masz z tym jakiś problem ... – Borbea

+0

Działa również tutaj! Masz pytanie prawidłowe! :RE –

3

myślę, że to powinno wystarczyć:

var userInfo = error.userInfo 
+3

ważne jest, aby pamiętać, że to zadziała, ponieważ słownik w swift jest strukturą, która jest kopiowana podczas przypisywania, a nie instancją klasy, która musi zostać skopiowana (za pomocą funkcji copy()), aby uzyskać wymagany wynik (tj. Skopiowany słownik) – giorashc

+0

@ giorashc Ahh! Dziękuję za wskazanie tego. Kolejny powód, dla którego powinienem przeczytać więcej na temat korzystania z struct. Jedyny problem jaki mam teraz to "NSErrorPointer" nie ma członka o nazwie "userInfo''. Czy jest to związane z konwersją Swift lub błędem w moim kodzie? –

+1

Zauważ, że błąd jest podwójnym wskaźnikiem, więc musisz go usunąć dwukrotnie, aby dotrzeć do instancji. tj. '* (* error) .userInfo' – giorashc