无法在swift中使用Protocol扩展ObjC类

时间:2017-09-03 13:02:07

标签: ios objective-c swift xcode protocols

我正在尝试使用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 {

}

注意下面的错误表明我将完全相同的func添加到我已经添加到主协议的扩展中

enter image description here

不确定什么是错的,因为我能够添加另一种方法就好了。

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

2 个答案:

答案 0 :(得分:0)

您必须确认协议PopAWSIoTDataManagerProtocol,因为它extension AWSIoTDataManager

或者你可以试试这个

extension PopAWSIoTDataManagerProtocol where Self: AWSIoTDataManager {
  ...
}

答案 1 :(得分:0)

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

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

@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

}

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

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

要达到可选的Protcol要求,协议要求,即可选功能必须标记为@objc。