在Swift中实现Objective-C协议

5

我正在尝试在Swift中实现Objective-C的这个可选协议方法:

- (void)customHTTPProtocol:(CustomHTTPProtocol *)protocol logWithFormat:
(NSString *)format arguments:(va_list)arguments;

(参考: https://developer.apple.com/library/ios/samplecode/CustomHTTPProtocol/Introduction/Intro.html) 我已经用Swift编写了这个方法:

func customHTTPProtocol(`protocol`: CustomHTTPProtocol!, logWithFormat format: String!, arguments: CVaListPointer) {
}

它报错称无法满足可选要求,并建议在方法前添加@objc,但如果我添加@objc,则会出现错误(CVaListPointer无法在Objective-C中表示)。

问题在于此测试失败:

if ([strongDelegate respondsToSelector:@selector(customHTTPProtocol:logWithFormat:arguments:)]) {

而且这个swift方法没有被调用

1个回答

0
如果你想在 Swift 类中使用 Objective-C 的 @protocol,那么你需要将 Objective-C 类导入到 Bridging-Header 文件中。当你在 Swift 项目中使用 Objective-C 文件时,XCode 会自动创建 Bridging-Header 文件。然后,在你需要使用它的 Swift 文件中,你必须添加代理(delegate)。
class classname : baseClass<yourDelegate> {

}

在这个文件中,首先您必须添加所有必需的委托方法,然后添加必要时使用的可选方法。如果您不添加所需的委托方法,则会出现错误。
但是,如果您想要从Swift到Objective-C使用"protocol" ,则必须在 "protocol" 名称前添加@objc,并且要将Swift文件导入到Objective-C文件中,您还必须像这样添加@objc before class。
@objc protocol DelegateName {
    //declare your required and optional delegate method here
}

@objc classname : baseClass<yourDelegate> {

}

然后像这样将你的 Swift 类导入到 Objective-C 文件中,

#import <PROJ_NAME/PROJ_DIR-Swift.h>

还有需要补充的重要事项:

classObj.delegate = self

这已经完成了,我有另一个问题,由于协议方法是可选的,而(va_list)可能被错误地翻译。 - atrebbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接