【问题标题】:Swift Initializer MysterySwift 初始化器之谜
【发布时间】:2018-03-15 10:34:30
【问题描述】:

几块代码:

这行得通:

import Foundation

class Class1 {
    init(param1: String?) {
        print("hello")
    }

    convenience init() {
        self.init(param1: nil)
    }
}

class SubClass1: Class1 {

}

let obj = SubClass1()

在上面的代码中,指定的初始化器被传递给了 SubClass1,因为 SubClass1 没有提供自己的指定初始化器。此外,便利初始化程序也被传递下来。因此,这是可行的。

import Foundation

class Class1 {
    init(param1: String?) {
        print("hello")
    }

    convenience init() {
        self.init(param1: nil)
    }
}

class SubClass1: Class1 {
    override init(param1: String?) {
        print("hello 2")
        super.init(param1: nil)
    }
}

let obj = SubClass1()

这也有效,因为 SubClass1 现在提供了自己的指定初始化程序。

import Foundation

class Class1 {
    init(param1: String?) {
        print("hello")
    }

    init(param2: String?) {
        print("world")
    }

    convenience init() {
        self.init(param1: nil)
    }
}

class SubClass1: Class1 {
    override init(param1: String?) {
        print("hello 2")
        super.init(param1: nil)
    }
}

let obj = SubClass1()

这会在最后一行给出“错误:调用中的参数 'param1' 缺少参数”。 在这里,SubClass1 有一个指定的初始化器,而父类的便利初始化器也调用了相同的初始化器,那么为什么会出错?

这个

import Foundation

class Class1 {
    init(param1: String?) {
        print("hello")
    }

    required init(param2: String?) {
        print("world")
    }

    convenience init() {
        self.init(param1: nil)
    }
}

class SubClass1: Class1 {
    override init(param1: String?) {
        print("hello 2")
        super.init(param1: nil)
    }

    required init(param2: String?) {
        print("world")
        super.init(param2: nil)
    }
}

let obj = SubClass1()

这很有效:

import Foundation

class Class1 {
    init(param1: String?) {
        print("hello")
    }

    init(param2: String?) {
        print("world")
    }

    convenience init() {
        self.init(param1: nil)
    }
}

class SubClass1: Class1 {
    override init(param1: String?) {
        print("hello 2")
        super.init(param1: nil)
    }

    override init(param2: String?) {
        print("world")
        super.init(param2: nil)
    }
}

let obj = SubClass1()

为什么需要重写所有指定的初始化器,以便一个方便的初始化器工作,它只调用一个指定的初始化器?

【问题讨论】:

    标签: ios swift xcode initializer


    【解决方案1】:

    swift guide 中明确说明了这种行为。

    假设您为任何新属性提供默认值 在子类中引入,以下两条规则适用:

    规则 1 如果你的子类没有定义任何指定的初始化器,它 自动继承其所有超类指定的初始化器。

    规则 2 如果您的子类提供了它的 all 的实现 超类指定的初始化器——或者通过继承它们 规则 1,或者通过提供自定义实现作为其一部分 定义——然后它会自动继承所有的超类 便利初始化器。

    因此,基本上,您的子类必须覆盖/定义所有超类的指定初始化程序才能继承超类的便利初始化程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 2023-04-02
      • 2016-04-11
      • 2015-03-04
      • 2021-01-17
      相关资源
      最近更新 更多