作用:對實例對象的內(nèi)容進行初始化
Swift要求類或者結(jié)構(gòu)體中的存儲屬性(非lazy的)在對象構(gòu)造完畢后要有初始化值
語法:
init(參數(shù)列表){
初始化代碼
}
注意:
- Swift中類/結(jié)構(gòu)體/枚舉都需要構(gòu)造方法
- 構(gòu)造方法的作用僅僅是用于初始化屬性斥赋,而不是分配內(nèi)容擒贸,分配內(nèi)存是系統(tǒng)幫我們做的
- 構(gòu)造方法是隱式調(diào)用的价涝,通過
類名稱()
形式創(chuàng)建一個對象就會隱式調(diào)用init()
構(gòu)造方法 - 如果所有的存儲屬性都有默認值改览,可以不提供構(gòu)造方法誊稚,系統(tǒng)會提供一個隱式的構(gòu)造方法
- 如果存儲屬性可以提供缺省值舔示,那么提倡大家使用設(shè)置缺省值的方式尊浓,這樣可以簡化代碼(不用自定義狗仔方法,不用寫存儲屬性類型)
不帶參數(shù)的構(gòu)造方法
class Person{
var name : String = "zx"
var age : Int
func description() -> String {
return "name = \(name) age = \(age)"
}
init() {
print("init")
age = 3
}
}
/*
1.分配內(nèi)存
2.初始化name和age
3.構(gòu)造方法是隱式調(diào)用的
*/
var p = Person()
p.description()//顯示調(diào)用
帶參數(shù)的構(gòu)造方法
class Person2{
var name:String
var age:Int
func description() ->String{
return "name = \(name) age = \(age)"
}
/*
構(gòu)造方法的內(nèi)部參數(shù)退腥,默認也是外部參數(shù)
構(gòu)造方法對屬性的順序沒有要求超营,只要保證對象構(gòu)造完成時所有存儲屬性被初始化即可
*/
init(age:Int, name:String)
{
self.age = age
self.name = name
}
}
//var p2 = Person2(name: "zx", age: 30)
var p3 = Person2(age: 30, name: "zx")
可選屬性與構(gòu)造方法
class Car{
let name: String
init(name:String) {
self.name = name
}
}
class Person3{
let name : String
var age : Int
var car : Car?
/*
可選值存儲屬性可以不再構(gòu)造方法中初始化,
也就是說可選值在對象構(gòu)造完畢后不用初始化
其實如果不對可選存儲屬性進行初始化, 默認就是nil
*/
init(age:Int,name:String) {
self.age = age
self.name = name
}
func description() ->String{
return "name = \(name) age = \(age)"
}
}
結(jié)構(gòu)體構(gòu)造方法
struct Rect{
var width : Double = 0.0
var height : Double = 0.0
//系統(tǒng)默認會提供一個類似的方法
/*
init(width:Double,height:Double) {
self.width = width
self.height = height
}
init() {
self.width = 0.0
self.height = 0.0
}
*/
}
var r = Rect()
//var r = Rect(width: 1.0, heigth: 1.0)
/*
注意:
1.在類中默認是沒有逐一構(gòu)造器的
2.如果在結(jié)構(gòu)體中自定義了構(gòu)造方法, 那么系統(tǒng)不會生成默認的逐一構(gòu)造器
3.如果給存儲屬性提供了缺省值, 系統(tǒng)還是會提供默認的逐一構(gòu)造器
var r = Rect(width: 1.0, heigth: 1.0)
4.如果給存儲屬性提供了缺省值, 可以使用不帶參數(shù)的方法初始化結(jié)構(gòu)體
*/
"值類型"的構(gòu)造器代理
/*
構(gòu)造器代理: 構(gòu)造方法之間的相互調(diào)用
構(gòu)造方法可以調(diào)用其他構(gòu)造方法來完成實例的構(gòu)造, 稱之為構(gòu)造器代理
好處: 減少構(gòu)造方法之間的重復代碼
*/
struct Rect2 {
var width:Double
var height:Double
init(width:Double, height:Double)
{
self.width = width
self.height = height
}
init()
{
// self.width = 0
// self.height = 0
// 構(gòu)造器代理
self.init(width:0, height:0)
}
func show(){
print("width = \(width) height = \(height)")
}
}
var r2 = Rect2()
r2.show()
var r3 = Rect2(width: 100, height: 100)
r3.show()
通過閉包或者全局函數(shù)/類方法 設(shè)置存儲屬性的缺省值
func getTel() ->Int{
print("getTel")
return 11111111111
}
class Person4{
var name : String
//系統(tǒng)在初始化的時候回隱式執(zhí)行閉包,將閉包的執(zhí)行結(jié)果賦值給存儲屬性
var age : Int = {
print("age 閉包")
return 30
}()
lazy var height:Double = {
print("lazy 閉包")
return 180.0
}()
class func getAddress() -> String{
print("class getAddress")
return "北京"
}
func getNickName() -> String
{
return "小明"
}
var tel = getTel()
var address = Person4.getAddress()
/*
不能這樣寫, 因為調(diào)用方法時對象還沒有初始化完畢
self只有當所有的存儲屬性都初始化完畢之后才可以用
var nickName = self.getNickName
*/
init(name:String)
{
print("init")
self.name = name
}
}
var p5 = Person4(name: "zx")
// 懶加載是用到時才執(zhí)行, 而閉包賦值是初始化時就會執(zhí)行
print(p5.height)
/*
執(zhí)行結(jié)果:
age 閉包
getTel
class getAddress
init
lazy 閉包
180.0
*/