首页 文章

在Objective-C类中导入Swift协议

提问于
浏览
91

我尝试将名为 AnalyticProtocol 的Swift协议导入名为 AnalyticFactory 的Objective-C类 .

protocol AnalyticProtocol
{

}

I'm starting from an existing Objective-C project (I didn't create a new Swift project with xCode and I didn't found how configure my Objective-C project to be a Swift project in xCode 6 ) .

在我的Swift文件中,我包含名为 MyProjectName-Swift.h.h 文件,但编译器返回错误,告诉我 it doesn't exist . 所以,我创建了一个名为 MyProjectName-Swift.h.h 文件,它实际上是空的(我不知道我应该把它放在里面) .

Apple documentation中他们说我必须在我的 .m 文件中包含名为 MyProjectName-Swift.h.h 文件 . 但我需要将它不包括在我的 .m 文件中,而是包含在我的 .h 中 . 这可能有问题吗?

当我尝试编译时,我遇到了这个错误: :0: error: xxxAnalyticFactory.h:39: cannot find protocol declaration for 'AnalyticProtocol'

有罪的代码:

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

我想我不明白如何将Swift协议导入Objective-C类 .

有人看到我正在做的错误吗?

3 回答

  • 60

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

    @objc protocol AnalyticProtocol {
    
    }
    
  • 181

    无法在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的"Using Swift from Objective-C"部分中描述

    请注意,当您使用前向声明的协议(“找不到'AnalyticProtocol'的协议定义')时,XCode将在objC头文件中发出警告,但这可以忽略 - 实现将在编译时找到 .

  • 30

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

    • .swift 文件中,在协议名称前添加 @objc
    @objc protocol AnalyticProtocol {
    
    }
    
    • .m 文件中,导入生成的Swift标头并采用私有类别中的协议 . (头文件自动命名):
    #import "ProductModuleName-Swift.h"
    
    @interface AnalyticFactory () <AnalyticProtocol>
    
    @end
    

    这是Apple推荐的方法 . 您可以在此处了解有关混合和匹配Objective-C和Swift的更多信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

相关问题