指定&便利初始化器

时间:2017-01-03 10:21:25

标签: ios swift

我在swift中有关于初始化程序的查询。根据苹果' Swift3.0

  1. 指定的初始化程序必须从其直接超类调用指定的初始化程序。
  2. 便捷初始化程序必须从同一个类调用另一个初始化程序。
  3. 便利初始化程序必须最终调用指定的初始化程序。
  4. 现在我有两个A级和A级B(A的子类)。 A& B都有两个具有以下结构的指定初始化器

    enter image description here

    有人可以建议B级指定的初始化程序如何调用A类初始化程序吗?

1 个答案:

答案 0 :(得分:1)

由于A中有两个指定的初始化程序,由于签名不同,这些初始化程序不具有歧义,因此可以相互区分。这意味着您可以从子类A轻松调用B的相应指定初始值设定项。例如,A

class A {
    var a: Int

    // designated "#1"
    init() {
        a = 0
    }

    // designated "#2"
    init(_ a: Int) {
        self.a = a
    }

    // convenience initializer for A
    convenience init(_ foo: String) {
        print(foo)
        self.init(42)
    }
}

我们有,例如<​​/ p>

class B: A {
    let b: Int

    // designated "sub#1"
    override init() {
        b = 42
        super.init() // use A's designated #1
    }

    // designated "sub#2"
    override init(_ a: Int) {
        b = 24
        super.init(a) // use A's designated #2
    }

    // non-overriding designated "#3"
    init(b: Int) {
        self.b = b
        super.init() // use A's designated #1
    }

    // convenience initializer for B
    convenience init(_ foo: String) {
        print(foo)
        self.init() // use B's designated #1
    }
        // you may only call designated initializers of the superclass
}

但请注意,子类的初始值设定项可能仅调用其超类的指定初始值设定项。这由the Language Guide - Initializers - Initializer Delegation for Class Types [强调我的]中的规则1和2涵盖:

  

类类型的初始化程序委派

     

简化指定与便利之间的关系   初始化程序,Swift应用以下三个委托规则   初始化程序之间的调用:

     

规则1

     

指定的初始化程序必须从其中调用指定的初始值设定项   直接超类

     

规则2

     

便捷初始值设定项必须从中调用另一个初始值设定项   类

     

规则3

     

便利初始化程序必须最终调用指定的   初始化程序。

因此,您可能无法从A的便捷初始值设定项访问B的便捷初始值设定项,B的指定初始值设定项必须按照上述规则1自然地仅调用指定的A的初始值设定项。