Obift中的ObjC协议实现

时间:2015-06-29 07:10:04

标签: ios swift protocols

好的,这是一个大问题。我有一个用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 ""
    }
}

然后baam我们再次收到此错误,即使auto-complete为我完成了getAxisLabel函数。

我强烈怀疑问题出在问题&#34;价值&#34;它的功能参数&#34;价值&#34;。

任何帮助都将受到高度赞赏。

修改

请注意,this library在技术上并非我的,所以我无法改变它。我需要一种方法在Swift中使用它而不改变它的原始声明。我的例子只是为了简化我的问题。

我做了什么

我尝试过以下方案但没有成功:

&#39;具有与协议所要求的名称不同的参数名称。错误

func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
    return ""
}

&#39;具有与协议所要求的名称不同的参数名称。错误

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
    return ""
}

&#39;类型不符合协议&#39;

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! {
    return ""
}

请参阅accepted answer

1 个答案:

答案 0 :(得分:9)

我不知道这是不是一个错误。 Objective-C协议方法

- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;

(大写&#34; V&#34;在Value:中)映射到Swift为

func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String!

(小写&#34; v&#34;在value:中),但没有

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