【问题标题】:Overriding an Obj-C class method from Swift which returns NSArray从返回 NSArray 的 Swift 覆盖 Obj-C 类方法
【发布时间】:2016-05-23 15:46:29
【问题描述】:

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

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

我刚刚收到错误消息“Method does not override any method from its superclass

所以我的失败如下所示:

但是如果将返回类型更改为像 NSString* 这样简单的东西,它就可以正常工作

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

【问题讨论】:

  • @Kex 这将如何解决问题?用户正在尝试实现一个类方法。

标签: ios objective-c swift nsarray


【解决方案1】:

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

将您的方法返回类型更改为[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; 具有相同的行为并桥接到隐式展开的可选选项。

【讨论】:

  • 谢谢你的答案,我想我已经试过了!但我错过了!在末尾。检查定义的好提示,不知道为什么我没有尝试。
【解决方案2】:

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

在 ObjC 中声明方法

+ (NSArray<NSString *>*)exampleMethod;

然后你可以在 Swift 中编写

override class func exampleMethod() -> [String]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2010-11-06
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多