在Objective-C类中导入一个Swift协议

我尝试将名为AnalyticProtocol的Swift协议导入名为AnalyticProtocol的Objective-C类。

 protocol AnalyticProtocol { } 

我从一个现有的Objective-C项目开始(我没有用xCode创build一个新的Swift项目,我没有发现如何将我的Objective-C项目configuration为xCode 6中的Swift项目 )。

在我的Swift文件中,我包含名为MyProjectName-Swift.h.h文件,但编译器向我返回一个错误,告诉我它不存在 。 所以,我创build了一个名为MyProjectName-Swift.h.h文件,它实际上是空的(我不知道应该放在里面)。

在苹果文档中他们说我必须在我的.m文件中包含名为MyProjectName-Swift.h .h文件。 但是我需要把它包含进我的.m文件中,但是放到我的.h文件中。 这可能是有问题的吗?

当我尝试编译我有这个错误: 0:错误:xxxAnalyticFactory.h:39:找不到'协议声明'AnalyticProtocol'

而这个罪名是:

 @interface AnalyticFactory : NSObject { Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used. } 

我想我不太清楚如何将Swift协议导入到Objective-C类中。

有没有人看到我在做什么错误?

您需要像这样将@objc属性添加到Swift协议中:

 @objc protocol AnalyticProtocol { } 

无法在objC头文件中导入Xcode生成的Swift头文件。

所以,既然你想在objC头文件中使用Swift代码,你需要在objC头文件中“转发”声明你想使用的类和协议,如下所示:

 @protocol AnalyticProtocol; 

您现在可以在您的objC类声明中使用该协议:

 @interface AnalyticFactory : NSObject { Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used. } 

在您的实现文件(objC .m文件)中,您可以导入Xcode生成的Swift头(“ProductModuleName-Swift.h”)文件,编译器现在可以知道正确的实现AnalyticProtocol

这也在Apple Docs中的“使用Objective-C中的Swift”部分进行了描述

请注意,当您使用forward声明的协议(“无法findAnalyticProtocol的协议定义”)时,XCode会在objC头文件中给出一个警告,但这可以忽略 – 在编译时会find该实现。

有三个简单的步骤:

  1. .swift文件中,在协议名称之前添加@objc

     @objc protocol AnalyticProtocol { } 
  2. 在你的.m文件中,导入生成的Swift头文件。 (头文件被自动命名):

     #import "AnalyticProtocol-Swift.h" 
  3. 对于Swift协议,你也需要在你的.h文件中声明协议:

     @protocol AnalyticProtocol; 

请注意,尽pipe这是苹果公司推荐的做法,但在编译时给出警告: Cannot find protocol definition

为了避免这个警告:

如果你没有将任何东西连接到Swift,你可以在你的.h文件中包含AnalyticProtocol-Swift.h (而不是步骤2中的.m )。 如果你使用的是桥接头,只要注意循环引用。 如果你有循环引用,但仍然想避免这个警告,你的另一种select是在Objective-C中实现协议。

您可以在这里了解更多关于混合和匹配Objective-C和Swift的知识。