<aside> 🍃 当你为存储属性设置默认值或通过构造器设置初始值时,不会触发任何属性观察器。
</aside>
<aside> 🐯 如果构造器定义了某个实参标签,就必须使用它。
</aside>
<aside> 🖼️ 在构造过程中,子类不能给父类的常量赋值,即只能给自己类中的常量属性赋值。
</aside>
<aside> ⚠️ 有默认构造器的前提是,没有自定义的构造器。
</aside>
<aside> 🤦♀️ 结构体有默认的逐一成员构造器,类没有,类只有在所有存储属性都有默认值的时候,构造实例时会自动调用默认构造器为其属性赋值。
</aside>
<aside> 🍥 默认构造器是当一个类型中所有的存储属性都有默认值且没有其他自定义的构造器时,默认生成的,而逐一成员构造器是结构体独有的,当一个结构体没有自定义的构造器时,就会有一个逐一成员构造器,无论其存储属性有没有默认值。所以结构体是可能同时拥有默认构造器和逐一成员构造器的。
</aside>
<aside> 🛀 如果你为某个值类型添加了自定义的构造器,则其默认的构造器(且包括结构体的逐一成员构造器)将不再可用。
</aside>
<aside> 🍿 假如你希望默认构造器、逐一成员构造器与自定义的构造器都能被调用,就把自定义构造器写在扩展里。
</aside>
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
let basicRect = Rect()
// basicRect 的 origin 是 (0.0, 0.0),size 是 (0.0, 0.0)
let originRect = Rect(origin: Point(x: 2.0, y: 2.0),
size: Size(width: 5.0, height: 5.0))
// originRect 的 origin 是 (2.0, 2.0),size 是 (5.0, 5.0)
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size(width: 3.0, height: 3.0))
// centerRect 的 origin 是 (2.5, 2.5),size 是 (3.0, 3.0)