ObjC协议在Swift中的实现

好的,这是一个大问题。 我有一个用ObjC( 这个 )写的图书馆。 我们有一个定义的协议。 当我试图在swift文件中使用它时,我经常得到:

types“XXX”不符合协议“XXX”

为了简化我制定的testing项目 – 它应该被创build为Swift项目。

然后使用下面的协议创buildObjC头文件(我称之为StupidProtocol.h)(请注意每个名称和值与给定的名称和值完全匹配,包括大写/小写):

@protocol MyProtocol <NSObject> - (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value; @end 

在桥接标题中:

 #import "StupidProtocol.h" 

然后回到Swift文件中:

 class ViewController: UIViewController, MyProtocol { func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { return "" } } 

而且我们还是得到了这个错误,尽pipeauto-complete完成了getAxisLabel函数。

我强烈怀疑问题是有“价值”的参数,它的function参数“价值”。

任何帮助将不胜感激。

编辑

请注意, 这个库在技​​术上不是我的,所以我不能改变它。 我需要一种方法来在Swift中使用它,而不改变它的原始声明。 我的例子只是为了简化我的问题。

我试过了什么

我尝试了以下scheme,但没有成功:

'与协议所要求的错误名称不同

 func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! { return "" } 

'与协议所要求的错误名称不同

 func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { return "" } 

'types不符合协议'

 func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! { return "" } 

看到接受的答案

我不知道这是否是一个错误。 Objective-C协议方法

 - (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value; 

(在Value:带有大写“V”)被映射为Swift

 func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! 

(在小写字母“v”的value: :),但没有一个

 func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { } func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { } 

被编译器接受以满足协议要求。

作为一种解决方法,您可以使用显式的Objective-Cselect器名称注释该方法:

 class ViewController: UIViewController, MyProtocol { @objc(getAxisLabel:Value:) func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { return "" } }