好的,这是一个大问题 . 我有一个用ObjC编写的库(this) . 我们有一个定义的协议 . 当我试图在swift文件中使用它时,我不断得到:
类型“XXX”不符合协议“XXX”
为了简化我构建测试项目的事情 - 它应该被创建为Swift项目 .
然后使用以下协议创建ObjC头文件(我称之为StupidProtocol.h)(请注意每个名称和值与给定的名称和值完全匹配,包括大写/小写):
@protocol MyProtocol <NSObject>
- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
@end
在桥接 Headers 中:
#import "StupidProtocol.h"
然后回到Swift文件中:
class ViewController: UIViewController, MyProtocol
{
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
return ""
}
}
和baam我们再次得到这个错误,即使auto-complete为我完成了getAxisLabel函数 .
我强烈怀疑问题是参数“value”和它的函数参数“Value” .
任何帮助将受到高度赞赏 .
编辑
请注意this library在技术上不是我的,所以我无法改变它 . 我需要一种方法在Swift中使用它而不改变它的原始声明 . 我的例子只是为了简化我的问题 .
我做了什么
我尝试过以下方案但没有成功:
'具有与协议'错误所需的名称不同的参数名称
func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
return ""
}
'具有与协议'错误所需的名称不同的参数名称
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
return ""
}
'类型不符合协议'
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! {
return ""
}
解
1 回答
我不知道这是不是一个bug . Objective-C协议方法
(在
Value:
中使用大写"V")映射到Swift as(在
value:
中使用小写"v"),但没有编译器接受它以满足协议要求 .
作为一种变通方法,您可以使用显式的Objective-C选择器名称来注释该方法: