【问题标题】:ObjC protocol Implementation in SwiftSwift 中的 ObjC 协议实现
【发布时间】: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 应该可以工作

标签: ios swift protocols


【解决方案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 关键字作为解决方法,但不知道如何准确使用它。也很高兴知道以供将来参考!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2015-11-18
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多