[英]ObjC protocol Implementation in Swift
好的,这是个大问题。 我有一个用ObjC( this )编写的库。 在那里,我们有一个已定义的协议。 当我尝试在快速文件中使用它时,我经常得到:
类型“ 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”。
任何帮助将不胜感激。
编辑
请注意, 该库在技术上不是我的,因此我无法更改。 我需要一种在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 ""
}
解
查看已接受的答案
我不知道这是否是错误。 Objective-C协议方法
- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
(在Value:
使用大写的“ V”)映射为Swift
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String!
( value:
小写字母“ v” :),但没有
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { }
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { }
被编译器接受以满足协议要求。
解决方法是,可以使用显式的Objective-C选择器名称注释该方法:
class ViewController: UIViewController, MyProtocol
{
@objc(getAxisLabel:Value:)
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
return ""
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.