从 Swift 覆盖 returns NSArray 中的 Obj-C class 方法

Overriding an Obj-C class method from Swift which returns NSArray

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

这几乎肯定是愚蠢的,但我似乎无法覆盖 swift class 中的 class 方法,其中基础 class 是 Objective C,具体来说 return 类型是 NSArray*.

我刚得到错误,“Method does not override any method from its superclass

所以我的失败如下图所示:

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

这样简单的类型,它就可以正常工作

现在我已经尝试 Array<AnyObject> 并与其他一些人一起玩过,但是我对 Swift 语法还是有点陌生​​,所以我几乎肯定遗漏了一些明显的东西。

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

将您的方法 return 类型更改为 [AnyObject]!

override class func exampleMethod() -> [AnyObject]! {
    return []
}

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

+ (NSArray * _Nonnull)exampleMethod; 连接到 override class func exampleMethod() -> [AnyObject]

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

+ (NSArray *)exampleMethod;+ (NSArray * _Null_unspecified)exampleMethod; 具有相同的行为并连接到隐式展开的可选。

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

在 ObjC 中声明方法

+ (NSArray<NSString *>*)exampleMethod;

然后在Swift你可以写

override class func exampleMethod() -> [String]