【问题标题】:Not able to extend ObjC class using Protocol in swift无法在 swift 中使用协议扩展 ObjC 类
【发布时间】:2017-09-03 13:02:06
【问题描述】:

我正在尝试使用 swift 中的协议扩展 ObjC 类以进行依赖注入,该类不归我所有,因此我无法进行更改。对于其中一种方法,它的工作但对于其他 Xcode 总是说该类没有确认协议并建议我将该方法添加到扩展中

下面是 ObjC 头文件中的声明

- (BOOL) subscribeToTopic:(NSString *)topic
                      QoS:(AWSIoTMQTTQoS)qos
          extendedCallback:(AWSIoTMQTTExtendedNewMessageBlock)callback;

这是协议及其扩展

protocol PopAWSIoTDataManagerProtocol {

    func publishString(_ data:String, onTopic:String, QoS:AWSIoTMQTTQoS) -> Bool
    func subscribeToTopic(_ topic: String, qoS: AWSIoTMQTTQoS, extendedCallback: (NSObject, String, Data) -> Void) -> Bool

}

extension AWSIoTDataManager : PopAWSIoTDataManagerProtocol {

}

注意下面的错误提示我将完全相同的功能添加到我已经添加到主协议的扩展中

不知道出了什么问题,因为我可以添加另一个方法就好了。

作为参考的文章是这个https://medium.com/flawless-app-stories/the-complete-guide-to-network-unit-testing-in-swift-db8b3ee2c327

【问题讨论】:

  • 如果我保持 publishString 方法一切正常

标签: ios objective-c swift xcode protocols


【解决方案1】:

您必须确认协议PopAWSIoTDataManagerProtocol,因为它是extensionAWSIoTDataManager

或者你可以试试这个

extension PopAWSIoTDataManagerProtocol where Self: AWSIoTDataManager {
  ...
}

【讨论】:

    【解决方案2】:

    您定义的协议具有强制实现的所有功能。

    您需要将它们定义为可选。您要么将它们定义为可选,要么实现所有它们,这是您所附加的错误图像。

    @objc protocol PopAWSIoTDataManagerProtocol {
    
        @objc optional func publishString(_ data:String, onTopic:String, QoS:AWSIoTMQTTQoS) -> Bool
        @objc optional func subscribeToTopic(_ topic: String, qoS: AWSIoTMQTTQoS, extendedCallback: (NSObject, String, Data) -> Void) -> Bool
    
    }
    

    Protocol 的默认行为,当实现时你必须覆盖所有的方法。这些被归类为协议要求。

    有可选的协议要求,不必由符合协议的类型实现。

    要实现可选协议要求,协议要求即可选功能必须标记为@objc。

    【讨论】:

    • 你能详细说明一下吗?为什么它们需要是可选的?当原始类已经具有这些功能时?
    • 澄清一下,当我只有 publishString 函数时,它运行正常没有问题
    • 还是会报同样的错误,至于对象符合PopAWSIoTDataManagerProtocol协议,需要所有方法实现。这是默认行为。即使刚刚发布字符串,我也收到了错误。
    • 你读了吗?我说它工作正常,添加第二种方法后开始出现单个方法错误
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多