【问题标题】:Type 'X' does not conform to protocol 'ResponseObjectSerializable'类型“X”不符合协议“ResponseObjectSerializable”
【发布时间】:2015-04-16 16:11:58
【问题描述】:

我尝试使用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 中使用它,有人遇到过吗?并且知道如何完成这项工作?

回应 到 @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
        }
    }
}

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    Shot 没有标记为@objc,与协议不同,因此您的init 不符合要求:

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

    导致错误:

    注意:协议需要初始化器 init(response:representation:) 类型为 (response: NSHTTPURLResponse, representation: AnyObject)

      init?(response: NSHTTPURLResponse, representation: AnyObject)`
      ^
    

    注意:候选人不是@objc,但协议需要它

    Shot的定义前面加上@objc,它应该可以编译。

    【讨论】:

    • 错误消失了,但让我感到困惑的是在 Apple Swift 文档中他们有一个关于 @objc 协议的示例,并且符合它的 swift 类不需要 @objc。我有编辑问题并添加代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多