在Objective-C类中导入Swift协议

yws3nbqq  于 2023-03-07  发布在  Swift
关注(0)|答案(5)|浏览(174)

我尝试将名为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类。
有人看出我做的事有错吗?

gv8xihay

gv8xihay1#

您需要将@objc属性添加到Swift协议中,如下所示:

@objc protocol AnalyticProtocol {

}
wvt8vs2t

wvt8vs2t2#

无法在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了。
官方Importing Swift into Objective-C中也对此进行了描述
请注意,当您使用正向声明的协议时,XCode会在objC头文件中给予警告(“找不到'AnalyticProtocol'的协议定义”),但这可以忽略-将在编译时找到实现。

tkclm6bt

tkclm6bt3#

对于任何只需要采用协议的人-您可以通过两个步骤来完成,而不会生成任何警告或错误:
1.在.swift文件中,在协议名称前添加@objc

@objc protocol AnalyticProtocol {

}

1.在您的.m文件中,导入生成的Swift头文件并在私有类别中采用该协议。(头文件自动命名):

#import "ProductModuleName-Swift.h"

@interface AnalyticFactory () <AnalyticProtocol>

@end

这是苹果推荐的方法,你可以在这里了解更多关于混合和匹配Objective-C和Swift的信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

exdqitrt

exdqitrt4#

我们可以在Objective C中使用swift协议,只需对代码做一些修改。另外,@objc声明的协议允许你拥有可选的和必需的方法,而无需默认实现。它有优点也有缺点。
当在Objective C中使用时,我们实际上可以将协议名称重命名为更具描述性的名称。我使用了“@objc(alias_name)"。
下面是代码,让我们有一个swift协议,带有@objc属性和别名,用于ObjC代码。

@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>
cuxqih21

cuxqih215#

如果要创建框架,则需要导入

#import "ProductModuleName-Swift.h"

变更为:

#import <ProductModuleName/ProductModuleName-Swift.h>

在这种情况下,您还必须使swift协议公开

@objc public protocol AnalyticProtocol {
  func something();
}

相关问题