Swift中初始化方法的顺序介绍
Swift中对象初始化过程分为两部分:第一部分是为对象的存储空间分配内存,并进行对该内存空间的初始化;第二部分是为对象的属性分配内存,并对该属性进行初始化。下面我们将详细介绍Swift中初始化方法的顺序。
1. 分配内存空间
1.1 Swift运行时为类分配内存空间,该内存空间包含实例变量和类方法列表。
1.2 Swift编译器根据类中定义的属性的存储特性分别计算存储属性内存布局,并把存储的位置信息填充到类的类型信息中。同时,Swift编译器也会为每个存储属性生成getter和setter方法的实现,以便在对象初始化和属性访问时被使用。
1.3 当通过调用类的初始化方法来创建对象时,Swift运行时分配对象的内存空间,并在该内存空间中保存实例变量的值和指向类的指针。该指针是用来支持通过子类调用继承自父类的方法的。
2. 初始化对象属性
2.1 Swift编译器会在类的初始化方法中插入一些代码,用于为属性分配默认值。
2.2 得益于 Swift 语言强大的类型推断系统,不必显式地对变量赋初值,Swift 会根据在变量声明的类型来赋初值,同时,在初始化的过程中类似 !nil
的分配空间的代码也会被插入,保证初始化过程的完整性。
2.3 在这个过程中也可能会通过公共的初始化方法来初始化属性。
2.4 便利初始化方法其实就是对默认初始化方法的封装,它只是初始化对象的某些属性而不是全部,也就是只是对本类自身属性的初始化,不会调用父类的初始化方法,也无法通过便利初始化方法来访问父类的属性。称之为便利初始化方法的原因是其主要目的是横跨层级调用其余初始化方法,虽然该方法可以使用和重写验证的便利初始化方法。
示例如下:
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(name: String) {
self.init(name: name, age: 0)
}
}
class Employee: Person {
var job: String
init(name: String, age: Int, job: String) {
self.job = job
super.init(name: name, age: age)
}
convenience override init(name: String, age: Int) {
self.init(name: name, age: age, job: "")
}
}
在上面的示例中,定义了一个Person类和一个Employee类,Employee类是Person类的子类,它可以继承Person类的属性和方法。
Person类有两个属性:name和age,以及一个指定初始化方法init(name:age:)。同时,还有一个便利初始化方法init(name:),该方法用于实现只传入name参数时的初始化。
Employee类有一个额外的属性:job,以及一个指定初始化方法init(name:age:job:)。它也继承了Person类的init(name:age:)方法。Employee类也有一个便利初始化方法init(name:age:),该方法可以用来初始化Employee对象时只传入name和age两个参数的情况。
在这个示例中,指定初始化方法和便利初始化方法的调用顺序是固定的。当调用便利初始化方法时,总会先调用它所对应的指定初始化方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Swift中初始化方法的顺序介绍 - Python技术站