在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该实现。
有三个简单的步骤:
-
在
.swift
文件中,在协议名称之前添加@objc
:@objc protocol AnalyticProtocol { }
-
在你的
.m
文件中,导入生成的Swift头文件。 (头文件被自动命名):#import "AnalyticProtocol-Swift.h"
-
对于Swift协议,你也需要在你的
.h
文件中声明协议:@protocol AnalyticProtocol;
请注意,尽pipe这是苹果公司推荐的做法,但在编译时会给出警告: Cannot find protocol definition
。
为了避免这个警告:
如果你没有将任何东西连接到Swift,你可以在你的.h
文件中包含AnalyticProtocol-Swift.h
(而不是步骤2中的.m
)。 如果你使用的是桥接头,只要注意循环引用。 如果你有循环引用,但仍然想避免这个警告,你的另一种select是在Objective-C中实现协议。
您可以在这里了解更多关于混合和匹配Objective-C和Swift的知识。