覆盖Swift的可用初始化程序

时间:2014-12-05 03:20:43

标签: ios xcode swift

以下是Swift教程的a link。 在初始化 - 覆盖可用的初始化程序部分中 请注意,如果使用不可用的子类初始值设定项覆盖可用的超类初始值设定项,则子类初始值设定项不能委托超类初始值设定项。

但是下面的例子:

class Document {
    var name: String?
    // this initializer creates a document with a nil name value
    init() {}
    // this initializer creates a document with a non-empty name value
    init?(name: String) {
        if name.isEmpty { return nil }
        self.name = name
    }
}

class AutomaticallyNamedDocument: Document {
    override init() {
      super.init()
      self.name = "[Untitled]"
    }
    // This is nonfailable override superclass's failable 
    override init(name: String) {
      // Why subclass initializer still can delegate up to the superclass initializer??
      super.init()
      if name.isEmpty {
        self.name = "[Untitled]"
      } else {
        self.name = name
      }
    }
}

子类初始值设定项无法委托超类初始值设定项 为什么子类初始化程序仍然可以委托超类初始化程序?

1 个答案:

答案 0 :(得分:5)

该段落意味着您无法委派重写的可用初始化程序。请注意前面的这段话:

  

类,结构或枚举的可用初始化程序可以从同一个类,结构或枚举委托给另一个可用的初始化程序。类似地,子类可用的初始化程序可以委托一个超类可用的初始化程序。

     

在任何一种情况下,如果您委托另一个导致初始化失败的初始化程序,整个初始化过程会立即失败,并且不会执行进一步的初始化代码。

这应该明确为什么你不能委托给被覆盖的可用初始化器 - 如果它真的失败了,整个初始化过程就会失败,但是你处于的中间可用的初始化程序。

在你的情况下,你要委托超类(super.init())的一个不可用的初始值设定项,所以没有问题。