在Objective-C类中导入Swift协议

Importing a Swift protocol in Objective-C class

我尝试将名为AnalyticProtocol的swift协议导入名为AnalyticFactory的objective-c类。

1
2
3
4
protocol AnalyticProtocol
{

}

我从一个现有的Objective-C项目开始(我没有用Xcode创建一个新的Swift项目,也没有找到如何在Xcode6中将我的Objective-C项目配置为Swift项目)。

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

在苹果的文件中,他们说我必须把我的.h文件MyProjectName-Swift.h包含在我的.m文件中。但我需要把它包括在我的.m文件中,而不是我的.h文件中。这会有问题吗?

当我试图编译时,出现了以下错误::0:错误:xxxanalyticfactory.h:39:找不到"analyticprotocol"的协议声明

以及犯罪代码:

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

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

有人看到我做的事情有错误吗?


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

1
2
3
@objc protocol AnalyticProtocol {

}


无法在objc头文件中导入xcode生成的swift头文件。

因此,由于要在objc头文件中使用swift代码,因此需要"转发声明"要在objc头文件中使用的类和协议,如下所示:

1
@protocol AnalyticProtocol;

现在可以在objc类声明中使用协议:

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

在您的实现文件(objc.m文件)中,您可以导入xcode生成的swift头文件("productmodulename swift.h"),编译器现在知道正确的实现AnalyticProtocol

苹果文档中的"使用来自目标C的swift"一节也对此进行了描述。

请注意,当您使用正向声明的协议时,Xcode将在objc头文件中发出警告("找不到'analyticprotocol'的协议定义"),但可以忽略这一点-将在编译时找到实现。


对于任何只需要采用协议的人,您可以分两步执行此操作,而不会生成任何警告或错误:

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

    1
    2
    3
    @objc protocol AnalyticProtocol {

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

    1
    2
    3
    4
    5
    #import"ProductModuleName-Swift.h"

    @interface AnalyticFactory () <AnalyticProtocol>

    @end
  • 这是苹果公司推荐的方法。您可以在这里了解更多关于混合和匹配objective-c和swift的信息:https://developer.apple.com/library/content/documentation/swift/conceptive/buildingcoaapps/mixandmatch.html