【问题标题】:Create convenience Initializer on subclass that calls failable Initializer在调用可失败初始化器的子类上创建便利初始化器
【发布时间】:2014-11-10 22:55:58
【问题描述】:

尝试了以下推导的许多变体,但没有任何工作。

import Foundation
import SceneKit


class test:SCNScene{
    override init(){
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }


    convenience init? (i:UIViewController){
        self.init(named:"") //Compile Error:use of self delegating initializer before self.init is called
    }

}

根据Swift documentation,初始化规则2,在实现了2个指定的Initializer之后,不应该init?(named:String)便利的failable Initializer可用吗?我怎么了?

【问题讨论】:

  • 规则 2 规定“便利初始化程序必须调用同一类的另一个初始化程序。” - 你的班级没有定义init?(named:String)
  • 我所指的规则是关于“自动初始化器继承”主题:“如果您的子类提供其所有超类指定初始化器的实现——或者通过按照规则 1 继承它们,或者通过提供自定义实现作为其定义的一部分——然后它会自动继承所有超类便利初始化器。”
  • 是的,超类初始化器可供您使用,但这并不意味着您可以忽略我引用的规则 - 您必须从您的类中调用不方便的初始化器
  • 好的,那么如何在测试课上实现init?(named:String)呢? init?(named:String) 是一个方便的初始化程序,没有指定的初始化程序接受文件,即使在 self.init() 之后没有加载的方法@
  • 您需要在致电self.init(named:"") 之前致电self.init(),如错误消息所示

标签: ios swift


【解决方案1】:

初始化程序委托规则 #2 状态

便利构造器必须从同一个构造器调用另一个构造器 类。

您的类没有定义 init?(named:String),因此它将调用超类初始化程序(您可以根据您所指的其他规则 #2 访问它),但这不能满足要求从您的班级中调用不方便的初始化程序。

您可以在调用超类初始化程序之前简单地调用self.init

convenience init? (i:UIViewController){
        self.init()
        self.init(named:"") 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多