ios - Swift 中的 ObjC 协议(protocol)实现

标签 ios swift protocols

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

Type "XXX" does not conform to protocol "XXX"

为了简化事情,我制作了一个测试项目 - 它应该创建为 Swift 项目。

然后创建带有以下协议(protocol)的 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 中使用它的方法。我的例子只是为了简化我的问题。

我尝试了什么

我尝试了以下场景但没有成功:

'与协议(protocol)要求的参数名称不同'错误

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

'与协议(protocol)要求的参数名称不同'错误

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

'类型不符合协议(protocol)'

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

解决方案

参见 accepted answer

最佳答案

不知道是不是bug。 Objective-C协议(protocol)方法

- (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! { }

被编译器接受以满足协议(protocol)要求。

作为解决方法,您可以使用显式注释方法 Objective-C 选择器名称:

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

关于ios - Swift 中的 ObjC 协议(protocol)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31109734/

相关文章:

在方法中用作类型的 Swift 协议(protocol)不接受相同协议(protocol)的实例

android - 如何在 Android 和 iOS 设备上打开 Spotify 链接?

objective-c - 在 Swift 中声明具有泛型类型的变量

ios - IOS下Swift设置系统音量

arrays - 如何编写一个接受字符串输入并打印该字符串中第一个重复次数最多的字符的方法

ios - 动画期间 subview 堆叠

swift - 需要澄清 Swift 中的 "@objc class"

swift - 如果 Self 是 swift 中的两个(或更多)类之一,是否允许使用协议(protocol)?

ios - UIActivityViewController 问题 iOS 7 和 iOS 8?

iphone - iOS5自定义标签栏