【发布时间】:2015-06-29 07:10:04
【问题描述】:
好的,这是个大问题。我有一个用 ObjC (this) 编写的库。我们有一个定义好的协议。当我尝试在 swift 文件中使用它时,我不断得到:
类型“XXX”不符合协议“XXX”
为了简化我创建了一个测试项目 - 它应该被创建为 Swift 项目。
然后创建带有以下协议的ObjC头文件(我称之为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 ""
}
}
尽管自动完成为我完成了 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 ""
}
解决方案
【问题讨论】:
-
Obj c 是大写 V,swift 是小写 v。使它们都小写。两者都应该是小写的。
-
尝试使用外部参数名称“Value”和内部参数名称“value”编写 swift 方法,例如:“Value value: CGFloat”
-
这可能会解决问题,但你不应该首先使用大写 V。放下它,它会起作用。
-
请注意,这个方法声明不是我的——我完全同意它被声明为错误的。但我需要在 Swift 中使用具有此声明的库。如果你能以某种方式帮助我,那就太好了。
-
然后@hola 修复 Value 值:CGfloat 应该可以工作