gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:08:56 24 4
gpt4 key购买 nike

好的,这是个大问题。我有一个用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com