【问题标题】:Swift: odd XCode behaviour with required initializer in subclass of NSArraySwift:在 NSArray 的子类中具有所需初始化程序的奇怪 XCode 行为
【发布时间】:2014-10-20 11:31:32
【问题描述】:

问题背景:我有一个类是 NSArray 的子类,不是直接的,而是它。 结构或多或少类似于MyClass -> Class1 -> Class2 -> NSArray

除了MyClass 之外的所有内容都在Objective-C 中,MyClass 在Swift 中。在我升级到 Yosemite 和 Xcode 6.1 之前它运行良好。

现在,在编译过程中会抛出错误

'required' initializer 'init(arrayLiteral:)' must be provided by subclass of 'NSArray'

这很奇怪,因为还有其他类,MyClass 的兄弟姐妹没有编译器抱怨它们。 当我添加初始化程序时,

required convenience init(arrayLiteral elements: AnyObject...) { fatalError("not implemented") }

XCode 抛出另一个错误,提示 Declarations from extensions cannot be overridden yet

有人知道我能做什么吗?代码完全零更改。

【问题讨论】:

  • 您尝试子类化 NSArray 是否有特殊原因?除非您正在做一些非常复杂的事情,否则似乎不需要它。
  • 当我加入项目时它就在那里,并且在项目中的几个地方使用了“MyClass”。它是项目架构的一部分。

标签: ios objective-c xcode swift compilation


【解决方案1】:

您可能只是在其他文件中看不到编译错误,因为编译会尝试在第一个有问题的文件处停止。

如果您没有在子类中指定任何指定的初始化程序,或者您覆盖了所有指定的初始化程序但没有便利初始化程序,那么有问题的初始化程序会自动继承。在这种情况下,它编译得很好:

class MyArray1: NSArray {
    override init() { fatalError("todo") }
    override init(objects: UnsafePointer<AnyObject?>, count cnt: Int) { fatalError("todo") }
    required init(coder aDecoder: NSCoder) { fatalError("todo") }
}


class MyArray2: MyArray1 {
}

这在 Xcode 6.1 上编译得很好。

请参阅《Swift 编程指南》中的 Automatic Initializer Inheritance

【讨论】:

  • 是的,我明白了,所以我添加了缺少的初始化程序,但随后它导致另一个错误,特别奇怪,因为它不是扩展而是子类。
  • 这就是为什么我写的不是覆盖任何便利初始化器。一旦你这样做,你就会失去继承权。正如错误消息所述,无论如何您都不能覆盖这个初始化程序。 -- 您必须覆盖我在示例中使用的 no 初始化程序或 所有三个 - 不多也不少。
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2016-10-20
相关资源
最近更新 更多