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 "" } }