2015-04-07 9 views
6

Ho trovato questo guide per ricevere un corpo HTTP, che contiene un messaggio di errore formattato JSON con AFNetworking 2. La guida è in Objective-C e sto facendo del mio meglio per convertirlo in Swift.Conversione di mutableCopy in Swift

Ecco il codice che sto cercando di convertire in 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]); 
} 

più specifiche è questa parte c'è il problema:

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

Questo è il mio codice corrente:

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

Come si converte questa linea in Swift? Sono abbastanza nuovo con il linguaggio Swift/Objective-C, quindi potrebbe esserci una soluzione semplice, ma non sono ancora riuscito a trovarlo.

risposta

1

ho trovato la stessa guida che descrive come analizzare messaggio di errore nel AFNetworking 2 e qui è la mia realizzazione a 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) 
    } 

Speranza questo aiuterà qualcuno.

+0

E funziona come dovrebbe? –

+0

Funziona Michael, lo sto usando nella mia più recente app. Prova tu stesso. Fatemi sapere se avete qualche problema con esso ... – Borbea

+0

Funziona anche qui! Hai la domanda corretta! : D –

3

Penso che questo dovrebbe fare il trucco:

var userInfo = error.userInfo 
+3

importante notare che questo lavoro dal momento che un dizionario in SWIFT è una struttura che viene copiato quando viene assegnato piuttosto che un'istanza del tipo di classe che deve essere copiato (con copia()) per ottenere il risultato richiesto (vale a dire un dizionario copiato) – giorashc

+0

@giorashc Ahh! Grazie per la segnalazione. Un altro motivo per cui dovrei leggere di più sull'utilizzo di struct. L'unico problema che ho ora è un '' NSErrorPointer '' non ha un membro chiamato 'userInfo''. Questo è associato con la conversione Swift o un bug nel mio codice? –

+1

nota che l'errore è un doppio puntatore quindi è necessario derefernce due volte per raggiungere l'istanza. vale a dire '* (* errore) .userInfo' – giorashc

Problemi correlati