2015-04-07 18 views
6

Tôi đã tìm thấy số guide này để nhận HTTP Body, phù thủy chứa thông báo lỗi có định dạng JSON với AFNetworking 2. Hướng dẫn nằm trong Objective-C và tôi đang cố gắng chuyển đổi nó sang Swift.Chuyển đổi mutableCopy thành Swift

Dưới đây là đoạn code tôi đang cố gắng để chuyển đổi thành 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]); 
} 

cụ thể hơn nó là một phần này có vấn đề:

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

Đây là mã hiện tại của tôi:

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

Làm cách nào để chuyển đổi dòng này thành Swift? Tôi khá mới với ngôn ngữ Swift/Objective-C, do đó, có thể có một giải pháp đơn giản cho nó, nhưng tôi đã không thể tìm thấy nó được nêu ra.

Trả lời

1

tôi thấy hướng dẫn tương tự mà mô tả làm thế nào để phân tích cú pháp thông báo lỗi trong AFNetworking 2 và đây là thực hiện của tôi trong 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) 
    } 

Hope điều này sẽ giúp ai đó.

+0

Và nó hoạt động như nó phải không? –

+0

Nó hoạt động Michael, tôi đang sử dụng nó trong ứng dụng mới nhất của tôi. Hãy thử nó cho mình. Hãy cho tôi biết nếu bạn có bất kỳ vấn đề với nó ... – Borbea

+0

Làm việc ở đây quá! Bạn đã có câu hỏi đúng! : D –

3

Tôi nghĩ rằng điều này sẽ làm các trick:

var userInfo = error.userInfo 
+3

quan trọng cần lưu ý rằng thao tác này sẽ hoạt động vì Từ điển nhanh là cấu trúc được sao chép khi được gán thay vì loại thể loại cần được sao chép (với bản sao()) để nhận kết quả được yêu cầu (tức là từ điển được sao chép) – giorashc

+0

@giorashc Ahh! Cảm ơn bạn đã chỉ ra điều đó. Một lý do khác tại sao tôi nên đọc thêm về cách sử dụng struct. Vấn đề duy nhất tôi có bây giờ là một '' NSErrorPointer 'không có một thành viên có tên' userInfo''. Điều đó có liên quan đến chuyển đổi Swift hoặc lỗi trong mã của tôi không? –

+1

lưu ý rằng lỗi là một con trỏ kép vì vậy bạn cần phải derefernce nó hai lần để đạt được ví dụ. tức là '* (* lỗi) .userInfo' – giorashc

Các vấn đề liên quan