构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例使用前有个过程是必须的,它包括设置实例中每个存储属性的初始值和执行其他必须的设置或构造过程。
类和结构体在创建实例时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。
你可以在构造器中为存储型属性设置初始值,也可以在定义属性时分配默认值。以下小节将详细介绍这两种方法。
注意当你为存储型属性分配默认值或者在构造器中为设置初始值时,它们的值是被直接设置的,不会触发任何属性观察者。
构造器在创建某个特定类型的新实例时被调用。它的最简形式类似于一个不带任何形参的实例方法,以关键字 init 命名:
init() {
// 在此处执行构造过程
}
示例 :
class Person {
var Name:String
var Age:Int
init(Name: String, Age: Int) {
self.Name = Name
self.Age = Age
}
func Say(){
print(self.Name)
}
}
var p1 = Person(Name:"test", Age:28);
p1.Say()
子类在默认情况下不会继承父类的构造器。但是如果满足特定条件,父类构造器是可以被自动继承的。
假设你为子类中引入的所有新属性都提供了默认值,以下 2 个规则将适用:
规则 1
如果子类没有定义任何指定构造器,它将自动继承父类所有的指定构造器。
规则 2
如果子类提供了所有父类指定构造器的实现——无论是通过规则 1 继承过来的,还是提供了自定义实现——它将自动继承父类所有的便利构造器。
即使你在子类中添加了更多的便利构造器,这两条规则仍然适用。
使用 super 关键字调用父类构造器
class Person {
var Name:String
var Age:Int
init(Name: String, Age: Int) {
self.Name = Name
self.Age = Age
}
func Say(){
print(self.Name)
}
}
class Man: Person{
var Gender:String
init(Gender: String, Name:String, Age:Int) {
self.Gender = Gender
super.init(Name: Name, Age: Age)
}
override func Say() {
super.Say()
print(self.Gender)
}
}
var p1 = Man( Gender: "男", Name:"test", Age:28);
p1.Say()