Swift 中的 ObjC 协议实现
Posted
技术标签:
【中文标题】Swift 中的 ObjC 协议实现【英文标题】:ObjC protocol Implementation in Swift 【发布时间】: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 ""
解决方案
见accepted answer
【问题讨论】:
Obj c 是大写 V,swift 是小写 v。使它们都小写。两者都应该是小写的。 尝试使用外部参数名称“Value”和内部参数名称“value”编写 swift 方法,例如:“Value value: CGFloat” 这可能会解决问题,但你不应该首先使用大写 V。放下它,它会起作用。 请注意,这个方法声明不是我的——我完全同意它被声明为错误的。但我需要在 Swift 中使用具有此声明的库。如果你能以某种方式帮助我,那就太好了。 然后@hola 修复 Value 值:CGfloat 应该可以工作 【参考方案1】:我不知道这是否是一个错误。 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 ""
【讨论】:
你是救生员!我知道它应该使用 @objc 关键字作为解决方法,但不知道如何准确使用它。也很高兴知道以供将来参考!以上是关于Swift 中的 ObjC 协议实现的主要内容,如果未能解决你的问题,请参考以下文章
swift 1.2 版中的 iCarousel 错误(候选不是 Objc 但协议需要它)