Swift中的ObjC协议实现

hri*_*.to 6 protocols ios swift

好的,这是一个大问题.我有一个用ObjC编写的库(这个).我们有一个定义的协议.当我试图在swift文件中使用它时,我不断得到:

类型"XXX"不符合协议"XXX"

为了简化我构建测试项目的事情 - 它应该被创建为Swift项目.

然后使用以下协议创建ObjC头文件(我称之为StupidProtocol.h)(请注意每个名称和值与给定的名称和值完全匹配,包括大写/小写):

@protocol MyProtocol <NSObject>

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

@end
Run Code Online (Sandbox Code Playgroud)

在桥接标题中:

#import "StupidProtocol.h"
Run Code Online (Sandbox Code Playgroud)

然后回到Swift文件中:

class ViewController: UIViewController, MyProtocol
{
    func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
        return ""
    }
}
Run Code Online (Sandbox Code Playgroud)

和baam我们再次得到这个错误,即使auto-complete为我完成了getAxisLabel函数.

我强烈怀疑问题是参数"value"和它的函数参数"Value".

任何帮助将受到高度赞赏.

编辑

请注意,这个库在技​​术上不是我的,所以我不能改变它.我需要一种方法在Swift中使用它而不改变它的原始声明.我的例子只是为了简化我的问题.

我做了什么

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

'具有与协议'错误所需的名称不同的参数名称

func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
    return ""
}
Run Code Online (Sandbox Code Playgroud)

'具有与协议'错误所需的名称不同的参数名称

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
    return ""
}
Run Code Online (Sandbox Code Playgroud)

'类型不符合协议'

func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! {
    return ""
}
Run Code Online (Sandbox Code Playgroud)

解

见接受的答案

Mar*_*n R 9

我不知道这是不是一个bug.Objective-C协议方法

- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
Run Code Online (Sandbox Code Playgroud)

(大写"V"in Value:)映射到Swift as

func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String!
Run Code Online (Sandbox Code Playgroud)

(小写"v"in value:),但没有

func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! { }
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! { }
Run Code Online (Sandbox Code Playgroud)

编译器接受它以满足协议要求.

作为一种变通方法,您可以使用显式的Objective-C选择器名称来注释该方法:

class ViewController: UIViewController, MyProtocol
{
    @objc(getAxisLabel:Value:)
    func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
        return ""
    }
}
Run Code Online (Sandbox Code Playgroud)