Swift 中的 ObjC 协议实现
ObjC protocol Implementation in Swift
好的,问题来了。我有一个用 ObjC(this) 编写的库。在那里我们有一个定义的协议。当我尝试在 swift 文件中使用它时,我不断得到:
Type "XXX" does not conform to protocol "XXX"
为了简化事情,我制作了一个测试项目 - 它应该创建为 Swift 项目。
然后创建 ObjC 头文件(我称之为 StupidProtocol.h),里面包含以下协议(请注意每个名称和值与给定的完全匹配,包括 uppercase/lowercase):
@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 中使用它而不更改其原始声明的方法。我的例子只是为了简化我的问题。
我尝试了什么
我尝试过以下情况但没有成功:
'has different arguments name from those required by protocol'错误
func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
return ""
}
'has different arguments name from those required by protocol'错误
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
return ""
}
'type does not conform to protocol'
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! {
return ""
}
解决方案
见
我不知道这是不是一个错误。 Objective-C 协议方法
- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
(Value:
中的大写 "V")映射到 Swift 为
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String!
(在 value:
中使用小写 "v"),但
中的 none
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(this) 编写的库。在那里我们有一个定义的协议。当我尝试在 swift 文件中使用它时,我不断得到:
Type "XXX" does not conform to protocol "XXX"
为了简化事情,我制作了一个测试项目 - 它应该创建为 Swift 项目。
然后创建 ObjC 头文件(我称之为 StupidProtocol.h),里面包含以下协议(请注意每个名称和值与给定的完全匹配,包括 uppercase/lowercase):
@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 中使用它而不更改其原始声明的方法。我的例子只是为了简化我的问题。
我尝试了什么
我尝试过以下情况但没有成功:
'has different arguments name from those required by protocol'错误
func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
return ""
}
'has different arguments name from those required by protocol'错误
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
return ""
}
'type does not conform to protocol'
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! {
return ""
}
解决方案
见
我不知道这是不是一个错误。 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 ""
}
}