1.構造器閉包
也叫構造函數,爲了初始化類和結構體等類型的實例屬性,關鍵字是init,init爲默認構造器,類裏面全部的非lazy的存儲屬性必須都有初始值,能夠經過帶有缺省值來初始化屬性,也能夠用init來初始化。析構器與構造器相反,在對象釋放時調用,關鍵字是deinit。ide
語法:init(參數列表){初始化代碼}函數
2。自定義構造器spa
帶有參數的構造方法,參數的個數,循序都任意代理
class buy {orm
var a:Int對象
var b:String!ip
init(aa a1:Int,bb b1:String){get
self.a = a1it
self.b = b1
}
}
var b = buy(aa: 2, bb: "book")//init就是自定義構造器
3.析構器
析構器只能用於類類型
class Person {
let name: String
init(name: String){
self.name = name
print("\(name)init" )
}
deinit{
print("\(name)deinit")
}
}
//var p1 = Person(name: "tom")
//print(p1.name)//只調用init
//要想調用deinit,p1必須是person可選類型,並且必須置空,以下
var p1: Person? = Person(name: "tom")
print(p1!.name)
p1 = nil//自動調用deinit
注意:deinit不適用於結構體,枚舉
class Animal {
init(){
print("animal init")
}
deinit{
print("animal deinit")
}
}
class Dog: Animal {
override init(){
print("dog init")
}
deinit{
print("dog deinit")
}
}
//var a: Animal? = Animal()
//a = nil
//
var d: Dog? = Dog()
d = nil
4.可選值存儲屬性能夠在構造方法中不進行初始化,默認爲空nil
5.針對結構體,系統會默認提供一個成員逐一構造器
struct Rect {
var w: Double//init可省略
var h: Double
}
var r = Rect(w: 2.0, h: 4.0)
6.值類型的構造器代理
就是構造方法之間的相互調用
struct Segment {
var origin: Double
var end: Double
init(origin: Double,end: Double){
self.origin = origin
self.end = end
}
init(){
// origin = 0.0
// end = 0.0
self.init(origin: 0.0,end: 0.0)
}
init(origin: Double,length: Double){
// self.origin = origin
// self.end = origin + length
self.init(origin: origin,end: origin + length)
}
func description()->String{
return "\(origin),\(end)"
}
}
var s = Segment(origin: 2.0, end: 2.0)
var s1 = Segment()
var s2 = Segment(origin: 2.0, length: 2.0)
print(s.description())
print(s2.description())
7.閉包或者全局函數或者當前類的類方法設置存儲屬性的缺省值
func GetValue()->Int{
return 10
}
class TestClass {
var x: Int = {()-> Int in
print("初始化開始")
sleep(4)
return 10
}()//將閉包執行事後的值做爲缺省值賦給x,注意閉包後要加(),不加的話就是把閉包賦值給x了,沒有意義
init(){
print("初始化完畢")
}
var z:Int = GetValue()//經過確據函數來設置缺省值
class func classGetValue()->Int {
print("class get value")
return 10
}
var b: Int = TestClass.classGetValue()//經過類方法來設置缺省值
}
var o = TestClass()