好的,这是个大问题。我有一个用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: 功能可能当前不在协议扩展中。您可以创建一个基类,尽管