[英]Importing a Swift protocol in Objective-C class
我尝试导入斯威夫特协议名为AnalyticProtocol
到一个名为Objective-C类AnalyticFactory
。
protocol AnalyticProtocol
{
}
我从一个现有的 Objective-C 项目开始(我没有用 xCode 创建一个新的 Swift 项目,我没有找到如何在 xCode 6 中将我的 Objective-C 项目配置为一个 Swift 项目)。
在我的 Swift 文件中,我包含了名为MyProjectName-Swift.h
的.h
文件,但编译器返回一个错误,告诉我它不存在。 所以,我创建了一个名为MyProjectName-Swift.h
的.h
文件,它实际上是空的(我不知道应该放什么)。
在Apple 文档中,他们说我必须在我的.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.
}
我想我不太明白如何将 Swift 协议导入到 Objective-C 类中。
有没有人看到我正在做的事情有错误?
您需要将@objc
属性添加到您的 Swift 协议中,如下所示:
@objc protocol AnalyticProtocol {
}
无法在 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 的“使用 Objective-C 中的 Swift”部分中有所描述
请注意,当您使用前向声明的协议(“找不到 'AnalyticProtocol' 的协议定义)时,XCode 将在 objC 头文件中给出警告,但这可以忽略 - 将在编译时找到实现。
对于任何只需要采用协议的人 - 您可以分两步完成,而不会产生任何警告或错误:
在您的.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
我们可以在目标 C 中使用 swift 协议,只需对代码进行少量更改。 此外,@objc 声明的协议让您拥有可选和必需的方法,而无需默认实现。 它有利有弊。
在 Objective C 中使用时,我们实际上可以将协议名称重命名为更具描述性。我使用“@objc(alias_name)”。
这是代码,让我们有一个带有@objc 属性和别名的 swift 协议,以便在 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>
如果您正在创建一个框架,所需的导入
#import "ProductModuleName-Swift.h"
更改为:
#import <ProductModuleName/ProductModuleName-Swift.h>
在这种情况下,您还必须公开swift 协议:
@objc public protocol AnalyticProtocol {
func something();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.