构造器用于创建一个新的类、结构体、枚举类型的实例的方法,无返回值,确保实例在使用前被正确初始化。
类和结构体必须在它们被创建时把它们所有的属性设置为合理的值。存储属性不能为不确定状态。
⚠️注意:如果一个属性常常使用同样的初始化值 ,提供一个默认值会比在初始化使用一个默认值会更好。很简单地就让能构造器更简洁,让你从默认值中推断出这个属性的类型。默认值也能让你优化默认构造器和继承构造器变得更容易。
⚠️注意:当你对给一个属性分配一个默认值的时候,它会调用它相对应的初始化方法,这个值是对属性直接设置的,不会通知它对应的观察者
- 在构造器里设置属性的初始值
⚠️注意:在设置静态属性值时,只要在初始化完成之前,都可以在初始化时随时修改静态属性。
默认构造器
Swift为每一个结构或者基类提供了默认的构造器,来初始化它们所包含的所有属性。默认构造器将会创建一个新的实例然后将它们的属性设置为默认值。
class TranficTool {
var name: String = "Tranfic Tool"
var wheels: Int = 2
var detail: String?
}
let tool = TranficTool()
print("tool:\(tool.name) wheels:\(tool.wheels) detail: \(tool.detail)")
//tool:Tranfic Tool wheels:2 detail: nil
⚠️注意:除了默认构造器之外,结构体类型还有一种成员逐一完成初始化的构造器,可以在定义结构的时候直接指定每个属性的初始值。
struct Size {
var width = 0.0
var height = 0.0
}
let twoByTwo = Size(width: 2.0,height: 2.0)
数值类型构造器
数值类型(结构和枚举)不支持继承,因此他们的构造器代理相对简单,因为它们只能使用自己的构造器代理。数值类型来说,可以使用self.init来调用其他构造器,⚠️只能在这个数值类型内部调用相应的构造器。
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)
}
}
print("\(Rect())")
//Rect(origin: Point(x: 0.0,y: 0.0),size: Size(width: 0.0,height: 0.0))
print("\(Rect(origin: Point(x: 2.0,y: 2.0),size: Size(width: 5.0,height: 5.0)))")
//Rect(origin: Point(x: 2.0,height: 5.0))
print("\(Rect(center: Point(x: 4.0,y: 4.0),size: Size(width: 3.0,height: 3.0)))")
//Rect(origin: Point(x: 2.5,y: 2.5),height: 3.0))
⚠️注意:如果你想要同时使用默认构造器和你自己设置的构造器,不要将这两种构造器写在一起,而是使用扩展形式。
类的初始化
- 自定义初始化方法要先调用自己类默认初始化方法,自己重写默认初始化方法要先调用父类默认初始化方法 - 应该要先调用父类的构造器或者自身的默认构造器,以防止先给属性赋值了然后才调用父类或者自身的默认构造器把以前的赋值覆盖了
class FatherClass {
var name: String
init(name: String) {
self.name = name
self.functionA()
}
convenience init() {
self.init(name: "Father Class")
}
func functionA() {
print("a function in father class")
}
}
class BClass: FatherClass {
var age: Int
init(age: Int,name: String) {
self.age = age
super.init(name: name)
self.functionA()
self.funtionB()
}
convenience init(age: Int) {
self.init(age: age)
self.name = "Bclass"
}
func funtionB() {
print("a function in BClass function B")
}
}