在Objective-C类中导入Swift协议
我尝试将名为在Objective-C类中导入Swift协议,objective-c,swift,Objective C,Swift,我尝试将名为AnalyticProtocol的Swift协议导入名为AnalyticFactory的Objective-C类 protocol AnalyticProtocol { } 我从一个现有的Objective-C项目开始(我没有用xCode创建新的Swift项目,也没有找到如何在xCode 6中将我的Objective-C项目配置为Swift项目) 在我的Swift文件中,我包含了名为MyProjectName Swift.h的.h文件,但编译器返回一个错误,告诉我它不存在。 因此
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
文件,它实际上是空的(我不知道应该在里面放什么)
在报告中,他们说我必须在我的.m
文件中包含名为MyProjectName Swift.h
的.h
文件。但是我不需要将它包含到我的.m
文件中,而是要包含到我的.h
中。这会有问题吗
尝试编译时出现以下错误::0:error:xxxAnalyticFactory.h:39:找不到“AnalyticProtocol”的协议声明
以及被指控的法典:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
@接口分析工厂:NSObject
{
Class _analyticProtocolClass;//当前使用的分析类的类型。
}
我想我不太明白如何将Swift协议导入Objective-C类
有人看到我在做什么时出错了吗?您需要将
@objc
属性添加到您的Swift协议中,如下所示:
@objc protocol AnalyticProtocol {
}
对于任何只需要采用协议的人,您可以分两步执行,而不产生任何警告或错误:
.swift
文件中,在协议名称之前添加@objc
:
@objc protocol AnalyticProtocol {
}
.m
文件中,导入生成的Swift头并采用私有类别中的协议。(头文件自动命名):
#导入“ProductModuleName Swift.h”
@接口分析工厂()无法在objC头文件中导入Xcode生成的Swift头
因此,由于要在objC头文件中使用Swift代码,因此需要“前向声明”要在objC头文件中使用的类和协议,如下所示:
@protocol AnalyticProtocol;
现在,您可以在objC类声明中使用该协议:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
@接口分析工厂:NSObject
{
阶级
请注意,当您使用前向声明的协议(“找不到'AnalyticProtocol'的协议定义”)时,XCode将在objC头文件中发出警告,但这是可以忽略的-实现将在编译时找到。如果您正在创建框架,则需要导入
#import "ProductModuleName-Swift.h"
更改:
#import <ProductModuleName/ProductModuleName-Swift.h>
我们可以在Objective C中使用swift协议,只需对代码进行少量更改。此外,@objc声明的协议允许您在没有默认实现的情况下使用可选和必需的方法。它有其优点和缺点
在Objective C中使用时,我们实际上可以将协议名称重新命名为更具描述性的名称。我使用了“@objc(alias_name)”
这是密码,
让我们在objc代码中使用一个带有@objc属性和别名的swift协议
@objc(ObjTableViewReloadable) protocol TableViewReloadable: class {
func reloadRow(at index: IndexPath)
func reloadSection(at index: Int)
func reloadTable()
}
现在让farword在.h文件中声明我们的协议
@protocol ObjTableViewReloadable;
现在,您可以在.m文件中遵守此协议,并添加所需的方法实现
#import "MyApp-Swift.h"
@interface MyObjcViewController () <ObjTableViewReloadable>
#导入“MyApp Swift.h”
@接口MyObjcViewController()
查看WWDC 2014的视频。在视频的30:40左右,他们描述了如何在Objective-C类中访问Swift协议。感谢您的回答,但问题仍然存在。您可以发布一个重现该问题的示例项目吗?添加@objc有助于我将Swift类导入Obj-C@objc不总是有效的。遵守协议时,有时在.h
文件中的@接口
上添加协议时,它不起作用。但是,您可以将协议添加到.m
文件中的私有@接口
,它会修复问题(至少有时对我来说是这样)因此,在您的@实现
上面有@接口MyController()
。有时候,当您编辑时,Xcode 8会抱怨,但是当您实际构建它时,按照这个答案和注释,错误就会消失。为什么Xcode在编译并正常工作时会显示缺少协议的警告?有没有办法删除警告?仍然无法在此类上调用协议方法尽管如此。它将为选择器提供错误无可见@interface
,并生成以下警告:“找不到xxxx的协议定义“我仍然收到警告,无论是否有转发声明。我正在扩展中使用协议。这对我有效;此页面上的其他建议或答案无效。我使用Swift 4。这是删除警告的唯一方法(即使协议位于头文件中时也有效)这确实为我消除了警告,但编译时出现了错误,因为使用采用swift协议的ObjC文件的swift类看不到ObjC文件采用了该协议!同样的链接可通过WebArchive获得:感谢您发布此消息。我正在查看比dirt更旧的遗留代码,如果这符合ach有效,它会帮我省去很多痛苦。:)
@protocol ObjTableViewReloadable;
#import "MyApp-Swift.h"
@interface MyObjcViewController () <ObjTableViewReloadable>