2015-04-07 103 views
6

我發現這個guide接收到一個HTTP Body,巫婆包含一個帶有AFNetworking 2的JSON格式的錯誤消息。該指南在Objective-C中,我正在盡我所能將它轉換爲Swift。將mutableCopy轉換爲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]); 
} 

更具體的是這部分有問題:

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

這是我當前的代碼:

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

如何將此行轉換爲Swift? 我對Swift/Objective-C語言很陌生,所以可能有一個簡單的解決方案,但我還沒有找到它。

回答

1

我發現,介紹瞭如何在AFNetworking 2解析錯誤消息,這是我在斯威夫特執行相同的指南:

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

希望這將有助於某人。

+0

它的工作原理應該如何? –

+0

它適用於Michael,我在我的最新應用中使用它。親自嘗試一下。如果您有任何問題,請告訴我... – Borbea

+0

也適用於此!你的問題是對的! :d –

3

我想這應該做的伎倆:

var userInfo = error.userInfo 
+3

重要的是要注意,這將工作,因爲在swift中的字典是一個被分配時複製的結構,而不是需要複製的類類型實例(用copy())來獲得所需的結果(即複製的字典) – giorashc

+0

@giorashc啊!感謝您指出了這一點。爲什麼我應該閱讀更多關於使用struct的另一個原因。我現在唯一的問題是'NSErrorPointer'沒有名爲'userInfo'的成員。這與Swift轉換或我的代碼中的錯誤有關嗎? –

+1

請注意,錯誤是一個雙指針,因此您需要對它進行兩次取消以達到實例。即'*(*錯誤).userInfo' – giorashc