首页 > 解决方案 > Swift 5 从 super 子类化,需要初始化

问题描述

我正在阅读 Swift 学徒第 3 版。

本书快速跳过所需的初始化程序。

如果我有一个超级类:

class Animal {
    let animalType: String

    required init(animalType: String) {
        self.animalType = animalType
    }

    convenience init(animal: Animal) {
        self.init(animalType: animal.animalType)
    }
}

然后子类如:

class WildAnimal: Animal {
    let name: String

    required init(animalType: String) {
        name = ""
        super.init(animalType: animalType)
    }
}

我可以初始化子类的唯一方法是在所需的 init 中分配占位符值。即我必须输入名称=“”。

如果父类具有必需的 init,是否无法在初始化期间初始化子类参数?

标签: swift

解决方案


你可以有多个初始化器。您还必须“覆盖”所需的父初始值设定项。

class WildAnimal: Animal {
    var name: String

    required init(animalType: String) {
        name = ""
        super.init(animalType: animalType)
    }

    init(animalType: String, name: String) {
        self.name = name
        super.init(animalType: animalType)
    }
}

强制子类定义 derequired初始化器是required.

在类初始化器的定义之前写 required 修饰符,表示该类的每个子类都必须实现该初始化器

资源


推荐阅读