升级到Swfit 3:无法覆盖已标记为不可用的"init"

jef*_*ind 5 initialization ios swift

我刚刚继承了一个包含Apple的ResearchKit(RK)的iOS项目.

我已经升级到最新版本的RK以及Swift 3.虽然我在iOS和RK工作过,但我仍然不太自信.不管怎么说,有一类叫做SurveyTask它实现了ORKOrderedTask从RK.

在此输入图像描述

不能覆盖已标记为不可用的'init'

最后这个功能,stepz已经定义,我们有:

super.init(identifier: "survey", steps: stepz)
Run Code Online (Sandbox Code Playgroud)

我检查了ORKOrderedTask类定义,它有一个init函数.

在此输入图像描述

我一直在阅读有关初始化器但没有找到任何东西的信息.使用overrideconvenience在之前initSurveyTask不改变任何东西.同样的错误.任何帮助将不胜感激.

XCode版本8.1.

dee*_*eej 10

以下是您可以模仿无参数初始化程序并避免unavailable错误的方法:

class MyClass: ParentWithUnavailableInitializer {
    init(workaround _: Void = ()) {
        // Call a designated initializer
        super.init(param: "a very sensible value")
    }
}

// At a call site
let obj = MyClass()
Run Code Online (Sandbox Code Playgroud)

适用于Swift 3.2和Swift 4.

  • 谢谢@deej。更让我惊讶的是,我的一位同事将此解决方案用于CBPeripheral,而他甚至不必调用超类的指定初始化程序。那是我了解到,如果只有一个没有参数的指定初始化,那么会自动调用超类的初始化。因此,在子类中使用新的“空”初始化程序时,通常不可用的超类init被调用。迷人但出乎意料 (2认同)