当前位置: 首页 > 面试题库 >

Swift中的ObjC协议实现

终翰学
2023-03-14
问题内容

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

问题答案:

我不知道这是否是错误。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 ""
    }
}


 类似资料:
  • 协议(Protocols)为方法,属性和其他需求功能提供了蓝图。 它为方法或属性骨架而不是实现。 通过定义类,函数和枚举,可以进一步完成方法和属性的实现。 协议的一致性满足了协议要求的方法或属性。 语法 协议也遵循与类,结构和枚举类似的语法 - 协议在类,结构或枚举类型名称之后声明。 单个和多个协议声明也是可以的。 如果定义了多个协议,则必须用逗号分隔。 当要为超类定义协议时,协议名称应使用逗号跟

  • 协议规定了用来实现某一特定功能所必需的方法和属性。 任意能够满足协议要求的类型被称为遵循(conform)这个协议。 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。 语法 协议的语法格式如下: protocol SomeProtocol { // 协议内容 } 要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循

  • 问题内容: 除非a 声明为,否则引用似乎在Swift中不起作用,我不希望在纯Swift应用程序中使用它。 这段代码给出了一个编译错误(不能应用于非类类型): 我需要给协议加上前缀,然后它才能工作。 问题:什么是完成Swift的“纯” Swift方法 ? 问题答案: 您需要将协议类型声明为。 用你的话说,只有类才能符合此协议,而结构或枚举则不能。

  • 问题内容: 我有以下类层次结构: 实现一种协议方法,例如 在继承自的类中,不再调用新的可选协议方法,例如 问题答案: tl; dr,您需要在函数声明之前添加其Objective-C声明,例如 借助《Swift 3迁移指南》,我被告知这是一个解决方案,其中指出: 如果在声明符合性的类的子类中实现可选的Objective-C协议要求,则会看到警告,“实例方法’…’几乎与协议’…’的可选要求’…’相匹配

  • 引用在Swift中似乎不起作用,除非声明为(我不希望在纯Swift应用程序中这样做)。 我需要为协议添加前缀,这样它就可以工作了。 问题:实现的“纯”快速方法是什么?

  • 问题内容: 我有一个协议P1,它提供了Objective-C可选功能之一的默认实现。 当我提供可选功能的默认实现时,会出现警告 编译器警告: 版: 斯威夫特:3 Xcode:8(公开发行) 尝试: 尝试添加但无济于事 题: 我该如何解决? 有没有解决的办法? 码: 问题答案: 虽然我认为我可以回答您的问题,但这不是您想要的答案。 TL; DR: 功能可能当前不在协议扩展中。您可以创建一个基类,尽管