Importing a Swift protocol in Objective-C class
我尝试将名为
1 2 3 4 | protocol AnalyticProtocol { } |
我从一个现有的Objective-C项目开始(我没有用Xcode创建一个新的Swift项目,也没有找到如何在Xcode6中将我的Objective-C项目配置为Swift项目)。
在我的swift文件中,我包含了名为
在苹果的文件中,他们说我必须把我的
当我试图编译时,出现了以下错误::0:错误:xxxanalyticfactory.h:39:找不到"analyticprotocol"的协议声明
以及犯罪代码:
1 2 3 4 | @interface AnalyticFactory : NSObject { Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used. } |
我想我不太明白如何将Swift协议导入到Objective-C类中。
有人看到我做的事情有错误吗?
您需要将
1 2 3 | @objc protocol AnalyticProtocol { } |
无法在objc头文件中导入xcode生成的swift头文件。
因此,由于要在objc头文件中使用swift代码,因此需要"转发声明"要在objc头文件中使用的类和协议,如下所示:
1 | @protocol AnalyticProtocol; |
现在可以在objc类声明中使用协议:
1 2 3 4 | @interface AnalyticFactory : NSObject { Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used. } |
在您的实现文件(objc.m文件)中,您可以导入xcode生成的swift头文件("productmodulename swift.h"),编译器现在知道正确的实现
苹果文档中的"使用来自目标C的swift"一节也对此进行了描述。
请注意,当您使用正向声明的协议时,Xcode将在objc头文件中发出警告("找不到'analyticprotocol'的协议定义"),但可以忽略这一点-将在编译时找到实现。
对于任何只需要采用协议的人,您可以分两步执行此操作,而不会生成任何警告或错误:
在您的
1 2 3 | @objc protocol AnalyticProtocol { } |
在您的
1 2 3 4 5 | #import"ProductModuleName-Swift.h" @interface AnalyticFactory () <AnalyticProtocol> @end |
这是苹果公司推荐的方法。您可以在这里了解更多关于混合和匹配objective-c和swift的信息:https://developer.apple.com/library/content/documentation/swift/conceptive/buildingcoaapps/mixandmatch.html