无法专门化非泛型类型 ResponseSerializer

Posted

技术标签:

【中文标题】无法专门化非泛型类型 ResponseSerializer【英文标题】:Cannot specialize non-generic type ResponseSerializer 【发布时间】:2015-09-28 11:07:47 【问题描述】:

从documentation 和2.0 Migrate Guide 我尝试使用Response Serialization,但出现以下错误。我似乎无法弄清楚这些问题。 ResponseCollectionSerializable 也有同样的错误。

【问题讨论】:

【参考方案1】:

你应该使用符合ResponseSerializerGenericResponseSerializer

public protocol ResponseObjectSerializable 
    init?(response: NSHTTPURLResponse, representation: AnyObject)


extension Request 
    public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<T>) -> Void) -> Self 
        let responseSerializer = GenericResponseSerializer<T>  request, response, data in
            let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
            let result = JSONResponseSerializer.serializeResponse(request, response, data)

            switch result 
            case .Success(let value):
                if let
                    response = response,
                    responseObject = T(response: response, representation: value)
                
                    return .Success(responseObject)
                 else 
                    let failureReason = "JSON could not be serialized into response object: \(value)"
                    let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)
                    return .Failure(data, error)
                
            case .Failure(let data, let error):
                return .Failure(data, error)
            
        

        return response(responseSerializer: responseSerializer, completionHandler: completionHandler)
    

ResponseSerializer 是所有响应序列化程序必须遵守的协议。

【讨论】:

GenericResponseSerializer that conforms to ResponseSerializer 是什么意思? 我找到了。 github.com/Alamofire/Alamofire/tree/… 您可以编辑包含此代码的答案。这是因为我使用的是 3.0 代码而不是 2.0.2 我添加了代码来回答。我的意思是Request.response 方法接受ResponseSerializer 作为第一个参数,GenericResponseSerializer 是符合(实现)ResponseSerializer 协议的 Alamofire 构建通用类,可用于提供自动的、类型安全的响应对象序列化。

以上是关于无法专门化非泛型类型 ResponseSerializer的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 无法从非泛型静态方法的签名推断泛型类型参数类型?

泛型集合和非泛型集合的区别

如何在实现c#非泛型接口泛型属性时跳过传递类型?

如何为 useHitory() 覆盖非泛型类型,例如 @types/History?

无法在Repository类中创建非泛型LINQ函数

泛型集合与非泛型集合的异同