首页 文章

类型'X'不符合协议'ResponseObjectSerializable'

提问于
浏览
3

我尝试使用Alamofire进行自定义响应序列化

我遵循README中的内容并创建协议和扩展

@objc public protocol ResponseObjectSerializable {
    init?(response: NSHTTPURLResponse, representation: AnyObject)
}

extension Alamofire.Request {
    public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self {
        let serializer: Serializer = { (request, response, data) in
            let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
            let (JSON: AnyObject?, serializationError) = JSONSerializer(request, response, data)
            if response != nil && JSON != nil {
                return (T(response: response!, representation: JSON!), nil)
            } else {
                return (nil, serializationError)
            }
        }

        return response(serializer: serializer, completionHandler: { (request, response, object, error) in
            completionHandler(request, response, object as? T, error)
        })
    }
}

但是当我尝试遵守它时我得到了这个错误类型'my_model_class'不符合协议'ResponseObjectSerializable'

我的模型只是一个裸骨类

final class Shot: ResponseObjectSerializable {
    required init?(response: NSHTTPURLResponse, representation: AnyObject) {
    }
}

与Xcode 6.3一起使用,有谁经历过这个?并知道如何使这项工作?

Response 到@airspeed错误消失了,但令我困惑的是Apple Swift文档中他们在 @objc 协议上有一个例子,符合它的swift类不需要 @objc

@objc protocol CounterDataSource {
    optional func incrementForCount(count: Int) -> Int
    optional var fixedIncrement: Int { get }
}

class TowardsZeroSource: CounterDataSource {
    func incrementForCount(count: Int) -> Int {
        if count == 0 {
            return 0
        } else if count < 0 {
            return 1
        } else {
            return -1
        }
    }
}

1 回答

  • 2

    Shot 未标记为 @objc ,与协议不同,因此您的 init 与要求不匹配:

    @objc public protocol ResponseObjectSerializable {
        init?(response: NSHTTPURLResponse, representation: AnyObject)
    }
    
    final class Shot: ResponseObjectSerializable {
        @objc required init?(response: NSHTTPURLResponse, representation: AnyObject) {
        }
    }
    

    导致错误:

    注意:协议需要初始化器init(响应:表示:)与类型(响应:NSHTTPURLResponse,表示:AnyObject)init?(响应:NSHTTPURLResponse,表示:AnyObject)
    ^
    注意:候选人不是@objc,但协议需要它

    Shot 的定义前面贴上 @objc ,它应该编译 .

相关问题