从Swift重写一个Obj-C类方法,返回NSArray

时间:2016-05-23 15:46:30

标签: ios objective-c swift nsarray

我似乎无法覆盖以下方法,并创建了一个独立的示例,现在让我烦恼了几个小时。

它几乎肯定是愚蠢的,但我似乎无法覆盖swift类中的类方法,其中基类是Objective C,特别是返回类型是NSArray*

我刚收到错误," Method does not override any method from its superclass"

所以我的失败如下所示:

Error shown, with definition of class and superclass

但是如果将返回类型更改为像NSString *

这样简单的东西,它就可以正常工作

Working example with NSString

现在我已经尝试了Array<AnyObject>并与其他几个人一起玩了,但我对Swift语法仍然有点新鲜,所以我几乎肯定错过了一些明显的东西。

2 个答案:

答案 0 :(得分:5)

NSArray *[AnyObject]!ArrayAnyObject实例的隐式解包[ExampleBase exampleMethod]桥接到Swift。查看为[AnyObject]!生成的Swift接口:

ExampleBase

将方法返回类型更改为override class func exampleMethod() -> [AnyObject]! { return [] }

+ (NSArray * _Nonnull)exampleMethod;

要在Swift子类中指定可选或具体值,请使用Objective-C nullability说明符:

override class func exampleMethod() -> [AnyObject]+ (NSArray * _Nullable)exampleMethod;

的桥梁

override class func exampleMethod() -> [AnyObject]?+ (NSArray *)exampleMethod;

的桥梁

+ (NSArray * _Null_unspecified)exampleMethod;QWidget具有相同的行为并且与隐式展开的可选项桥接。

答案 1 :(得分:3)

解决方案是为编译器提供有关类型的更多信息。

在ObjC中声明方法

+ (NSArray<NSString *>*)exampleMethod;

然后在Swift中你可以写

override class func exampleMethod() -> [String]