Swift中的"required"关键字是什么意思?

Dou*_*ith 24 swift

请看以下示例:

class A {
    var num: Int

    required init(num: Int) {
        self.num = num
    }
}

class B: A {
    func haveFun() {
        println("Woo hoo!")
    }
}
Run Code Online (Sandbox Code Playgroud)

我把它Ainit功能标记为required.这到底是什么意思?我在子类中完全省略了它,B编译器根本没有抱怨.那怎么样呢?

Mar*_*n R 29

请参见"自动初始化程序继承":

规则1如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项.

规则2如果您的子类提供了所有超类指定初始值设定项的实现 - 通过按照规则1继承它们,或者通过提供自定义实现作为其定义的一部分 - 那么它会自动继承所有超类便捷初始值设定项.

在您的示例中,子类B本身不定义任何初始值设定项,因此它 继承了所有初始值设定项A,包括所需的初始值设定项.如果B只定义了便利初始化器(现在为Swift 2更新),情况也是如此:

class B: A {

    convenience init(str : String) {
        self.init(num: Int(str)!)
    }

    func haveFun() {
        print("Woo hoo!")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果子类定义了任何指定的(=非方便的)初始化器,那么它就不再继承超类初始化器.特别是所需的初始化程序不是继承的,因此不能编译:

class C: A {

    init(str : String) {
        super.init(num: Int(str)!)
    }

    func haveFun() {
        print("Woo hoo!")
    }
}
// error: 'required' initializer 'init(num:)' must be provided by subclass of 'A'
Run Code Online (Sandbox Code Playgroud)

如果你删除了requiredfrom A的init方法,那么类C 也会编译.

  • 那么,"required"关键字实际上做了什么? (11认同)
  • @AndrewPaulSimmons:它要求所有子类实现该方法 - 显式或通过继承.我在这里试图解释 - 因为OP显然对此感到困惑 - 这就是为什么来自问题的类'B`通过继承来满足要求,并且我给出了一个必须明确实现的例子. (4认同)

das*_*ght 27

required关键字意味着继承类必须提供的方法的一个实施方式.但是,该语言使所需的初始值设定项成为例外:

如果可以使用继承的初始化程序满足要求,则不必提供所需初始化程序的显式实现.

参考文档.