1、结构体和类,在创建实例过程中,需要进行一些初始化的工作,这个过程:构造过程。
实例最后被释放的时候,需要进行一些清除资源的工作,这个过程:析构过程。
2、构造函数:init方法,没有返回值,可以重载,在构造函数重载的情况下,运行环境可以根据它的参数标签、参数列表,调用合适的构造函数。
class Rectangle {
var width: Double = 0.0
var height: Double = 0.0
init() {
}
}
struct Rectangle {
var width: Double = 0.0
var height: Double = 0.0
init() {
}
init(width: Double, height: Double) {
self.width = width
self.height = height
}
}
3、构造函数主要作用:初始化实例,初始化存储属性和其他的初始化,如果在构造函数中初始化存储属性,那么定义时就不需要初始化
class Rectangle {
var width: Double
var height: Double
init() {
width = 0.0
height = 0.0
}
}
存储属性必须初始化,在构造函数中初始化,或者在定义的时候初始化;计算属性不保存数据,不需要初始化;构造函数不能初始化静态属性
构造函数中常量属性,可以不在定义的时候赋值,可以在构造函数中赋值
4、构造函数中的参数,可以直接作为参数标签使用
5、结构体有一种特殊的写法:
struct RectangleC {
var width: Double = 0.0
var height: Double = 0.0
}
var rectc = RectangleC(width: 320, height: 480)
按照从上到下的顺序,把属性名作为参数标签
6、构造函数代理:为了减少多个构造函数间的代码重复,在定义构造函数的时候,可以通过调用其他构造函数,来完成实例的部分构造过程。
7、结构体构造函数代理:self.init
struct Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
init() {
self.init(width: 640.0, height: 940.0)
}
init(length: Double) {
self.init(width: length, height: length)
}
}
8、类构造函数代理:
横向代理:类似于结构体类型构造函数代理,发生在同一类内部,便利构造函数
向上代理:发生在继承情况下,在子类构造过程中,要先调用父类构造函数,初始化父类的存储属性,指定构造函数
convenience init() {} 表示便利构造函数
9、析构函数
deinit,没有返回值,没有参数,没有小括号,不能重载 deinit{}
析构函数,只适用于类,不适用于枚举和结构体
存在析构函数,创建实例时,要用?,这样才能赋值nil,析构函数的调用是使实例被赋值nil
var rect1: Rectangle? = Rectangel(width: 320, height: 480) print()rect1 = nil触发析构函数的条件