我尝试将名为AnalyticProtocol
的Swift协议导入名为AnalyticFactory
的Objective-C类。
protocol AnalyticProtocol
{
}
我从一个现有的Objective-C项目开始(我没有用xCode创建一个新的Swift项目,也没有找到如何在xCode 6中将我的Objective-C项目配置为Swift项目)。
在我的Swift文件中,我包含了一个名为MyProjectName-Swift.h
的.h
文件,但是编译器返回了一个错误,告诉我它不存在。所以,我创建了一个名为MyProjectName-Swift.h
的.h
文件,实际上是空的(我不知道我应该在里面放什么)。
在Apple文档中,他们说我必须将名为MyProjectName-Swift.h
的.h
文件包含在我的.m
文件中,但我需要将其包含在我的.h
中,而不是包含在我的.m
文件中,这会有问题吗?
当我试图编译时,我遇到了这个错误::0:错误:xxx分析工厂h:39:找不到“AnalyticProtocol”的方案声明
以及犯罪代码:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
我想我不太明白如何将Swift协议导入Objective-C类。
有人看出我做的事有错吗?
5条答案
按热度按时间gv8xihay1#
您需要将
@objc
属性添加到Swift协议中,如下所示:wvt8vs2t2#
无法在objC头文件中导入Xcode生成的Swift头文件。
因此,既然你想在objC头文件中使用Swift代码,你就需要“正向声明”你想在objC头文件中使用的类和协议,如下所示:
现在可以在objC类声明中使用该协议:
在实现文件(objC .m文件)中,可以导入Xcode生成的Swift头文件(“ProductModuleName-Swift. h”),编译器现在就知道正确的实现
AnalyticProtocol
了。官方Importing Swift into Objective-C中也对此进行了描述
请注意,当您使用正向声明的协议时,XCode会在objC头文件中给予警告(“找不到'AnalyticProtocol'的协议定义”),但这可以忽略-将在编译时找到实现。
tkclm6bt3#
对于任何只需要采用协议的人-您可以通过两个步骤来完成,而不会生成任何警告或错误:
1.在
.swift
文件中,在协议名称前添加@objc
:1.在您的
.m
文件中,导入生成的Swift头文件并在私有类别中采用该协议。(头文件自动命名):这是苹果推荐的方法,你可以在这里了解更多关于混合和匹配Objective-C和Swift的信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
exdqitrt4#
我们可以在Objective C中使用swift协议,只需对代码做一些修改。另外,@objc声明的协议允许你拥有可选的和必需的方法,而无需默认实现。它有优点也有缺点。
当在Objective C中使用时,我们实际上可以将协议名称重命名为更具描述性的名称。我使用了“@objc(alias_name)"。
下面是代码,让我们有一个swift协议,带有@objc属性和别名,用于ObjC代码。
现在让farword在.h文件中声明协议
现在您可以在.m文件中遵循此协议并添加所需的方法实现。
cuxqih215#
如果要创建框架,则需要导入
变更为:
在这种情况下,您还必须使swift协议公开: