将mutableCopy转换为Swift

6
我发现这个指南可以接收HTTP Body,其中包含使用AFNetworking 2格式化为JSON的错误消息。该指南是用Objective-C编写的,而我正在尽力将其转换为Swift。
这是我试图转换为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语言比较新,因此可能有一个简单的解决方案,但我还没有找到它。
2个回答

3
我想这应该就可以解决问题了:
var userInfo = error.userInfo

3
需要注意的是,这种方法可以奏效,因为在 Swift 中,字典是结构体类型,而在赋值时会发生复制,而不是类类型实例需要使用 copy() 才能得到所需的结果(即复制的字典)。 - giorashc
@giorashc 啊!谢谢你指出来。这是我应该更多地阅读有关使用结构的原因之一。我现在唯一的问题是'NSErrorPointer' does not have a member named 'userInfo'。这是否与Swift转换相关还是我的代码中存在错误? - Michael Sørensen
1
请注意,error 是一个双重指针,因此您需要解引用两次才能访问实例。即 *(*error).userInfo - giorashc
Swift 避免直接访问指针,因此我无法使用 * 来访问它们。在这种情况下,*(*error).userInfo 将不起作用。编译器会报错:'*' is not a prefix unary operator - Michael Sørensen

1

我找到了一份相同的指南,介绍了如何解析AFNetworking 2中的错误消息,这是我在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)
    }

希望这能帮助到某人。

它可行,Michael。我正在我的最新应用程序中使用它。你也试试吧。如果你有任何问题,请告诉我。 - Borbea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接