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 但协议需要它)

翻译: Swift 中的委托保留周期 如何在“纯”Swift(没有@objc)中进行弱协议引用

Swift 协议实现另一个@objc 协议

@objc 动态变量在 Swift 4 中是啥意思

@objc 协议使 swift 编译器崩溃

@objc dynamic var在Swift 4中意味着什么