Swift中的ObjC协议实现

发布于 2021-01-31 23:39:10

好的,这是个大问题。我有一个用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 ""
}
关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

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

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

    (在中使用大写字母“ V” Value:)映射为Swift

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

    (在中使用小写字母“ v” 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 ""
        }
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看