Jea*_*ent 108 objective-c swift
我尝试导入一个名为AnalyticProtocolObjective-C类的Swift协议AnalyticFactory.
protocol AnalyticProtocol
{
}
Run Code Online (Sandbox Code Playgroud)
我从一个现有的Objective-C项目开始(我没有使用xCode创建一个新的Swift项目,我没有找到如何将我的Objective-C项目配置为xCode 6中的Swift项目).
在我的Swift文件中,我包含了.h命名的文件,MyProjectName-Swift.h但编译器返回一个错误,告诉我它不存在.所以,我创建了一个.h名为MyProjectName-Swift.h实际为空的文件(我不知道应该放在里面).
在苹果公司的文件,他们说我,包括我的.h文件名为MyProjectName-Swift.h我的.m文件.但我需要把它不包括在我的.m文件中,而是包含在我的文件中.h.这可能有问题吗?
当我尝试编译时,我遇到了这个错误:: 0:错误:xxxAnalyticFactory.h:39:无法找到'AnalyticProtocol'的协议声明
有罪的代码:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Run Code Online (Sandbox Code Playgroud)
我想我不明白如何将Swift协议导入Objective-C类.
有谁看到我正在做的错误?
Jam*_*est 206
您需要将@objc属性添加到Swift协议中,如下所示:
@objc protocol AnalyticProtocol {
}
Run Code Online (Sandbox Code Playgroud)
Pel*_*tau 72
无法在objC头文件中导入Xcode生成的Swift头.
因此,既然你想在objC头文件中使用Swift代码,你需要在objC头文件中"转发声明"你想要使用的类和协议,如下所示:
@protocol AnalyticProtocol;
Run Code Online (Sandbox Code Playgroud)
您现在可以在objC类声明中使用该协议:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Run Code Online (Sandbox Code Playgroud)
在您的实现文件(objC .m文件)中,您可以导入Xcode生成的Swift头文件("ProductModuleName-Swift.h")文件,AnalyticProtocol编译器现在可以知道正确的实现.
这也在Apple Docs的 "使用Swift from Objective-C"一节中描述
请注意,当您使用前向声明的协议("找不到'AnalyticProtocol'的协议定义')时,XCode将在objC头文件中发出警告,但这可以忽略 - 实现将在编译时找到.
Chr*_*let 45
对于任何只需要采用协议的人 - 您可以分两步完成此操作,而不会产生任何警告或错误:
在您的.swift文件中,@objc在协议名称之前添加:
@objc protocol AnalyticProtocol {
}
Run Code Online (Sandbox Code Playgroud)在您的.m文件中,导入生成的Swift标头并采用私有类别中的协议.(头文件自动命名):
#import "ProductModuleName-Swift.h"
@interface AnalyticFactory () <AnalyticProtocol>
@end
Run Code Online (Sandbox Code Playgroud)这是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()
}
Run Code Online (Sandbox Code Playgroud)
现在让 farword 在 .h 文件中声明我们的协议
@protocol ObjTableViewReloadable;
Run Code Online (Sandbox Code Playgroud)
您现在可以在 .m 文件中遵守此协议并添加所需的方法实现。
#import "MyApp-Swift.h"
@interface MyObjcViewController () <ObjTableViewReloadable>
Run Code Online (Sandbox Code Playgroud)
如果您正在创建框架,则需要导入
#import "ProductModuleName-Swift.h"
Run Code Online (Sandbox Code Playgroud)
更改为:
#import <ProductModuleName/ProductModuleName-Swift.h>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您还必须公开swift 协议:
@objc public protocol AnalyticProtocol {
func something();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49253 次 |
| 最近记录: |