我尝试将名为 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 回答
您需要将
@objc
属性添加到Swift协议中,如下所示:无法在objC头文件中导入Xcode生成的Swift头 .
因此,既然您想在objC头文件中使用Swift代码,则需要在objC头文件中“转发声明”要使用的类和协议,如下所示:
您现在可以在objC类声明中使用该协议:
在您的实现文件(objC .m文件)中,您可以导入Xcode生成的Swift头文件("ProductModuleName-Swift.h"),现在编译器将知道正确的实现
AnalyticProtocol
.这也在Apple Docs的"Using Swift from Objective-C"部分中描述
请注意,当您使用前向声明的协议(“找不到'AnalyticProtocol'的协议定义')时,XCode将在objC头文件中发出警告,但这可以忽略 - 实现将在编译时找到 .
对于任何只需要采用协议的人 - 您可以分两步执行此操作,而不会产生任何警告或错误:
.swift
文件中,在协议名称前添加@objc
:.m
文件中,导入生成的Swift标头并采用私有类别中的协议 . (头文件自动命名):这是Apple推荐的方法 . 您可以在此处了解有关混合和匹配Objective-C和Swift的更多信息:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html