閉包
閉包的用法和block類似,沒有標出的地方請參考block
- 1, 閉包的基本格式:
- 定義:
//閉包名稱: (參數01類型,參數02類型...)->(返回值類型)
//如下:
dataClosure: (String)->()//1個參數,無返回值
- 實現:
/*
{參數01,參數02... in
//code你的操作
return 返回值//如果有返回值,需要返回,沒有返回值無需這一步
}
*/
//如下:
var myClosure: (String,Int)->(String) = {name,age in
print("this is a closure,parameter is -----\(name)---\(age)")
return "this is a closure,parameter is -----\(name)---\(age)"
}
- 使用:
//例01
var dataClosure: (String)->() = {name in
print("this is a closure,parameter is -----\(name)")
}
//例02
var myClosure: (String,Int)->(String) = {name,age in
print("this is a closure,parameter is -----\(name)---\(age)")
return "this is a closure,parameter is -----\(name)---\(age)"
}
- 調用
//例01調用
dataClosure("zhangdanfeng")//無返回值
//例02調用
let closureResult = myClosure("zhang",10)//有返回值
- 2,這里再舉一個網絡請求的簡單封裝實例:
//請求方法
func getData (dataClosure: @escaping (_ dataStr: String)->()){
self.dataClosure = dataClosure;
DispatchQueue.global().async {
print("當前線程是:\([Thread .current]),在當前線程進行網絡請求")
//延遲三秒鐘進行模擬網絡
DispatchQueue.main.asyncAfter(deadline: .now()+3, execute: {
let resultStr = "this is the data from net"
//得到數據后回到主線程進行相應的操作
print(resultStr + "當前線程是\([Thread .current])");
dataClosure(resultStr);
})
}
}
- 在控制器中調用該方法
//常規閉包實現的寫法
imNetwork.getData(dataClosure: {(result) in
print("控制器中得到結果---\(result)---\([Thread .current]) ")
print("常規閉包實現的寫法")
})
/*
//常規閉包實現的寫法,內部有循環引用
imNetwork.getData(dataClosure: { [weak self] (result) in
print("控制器中得到結果---\(result)---\([Thread .current]) ")
self?.view.backgroundColor = UIColor.blue
})
//系統提示默認就是給出的尾隨閉包
//這里順便講一下尾隨閉包的概念:當一個閉包是函數中最后一個參數(或者是唯一的參數)的時候,可以直接把閉包從括號內拿出來放在函數后面如下:
imNetwork.getData() { (result) in
print("尾隨閉包--最后一個參數,但不是唯一的參數的時候,括號不可以省略")
}
//如果是唯一參數,括號內就沒有內容可以省略
imNetwork.getData { (result) in
print("尾隨閉包,唯一的參數肯定也是最后一個參數,括號內就沒有實際內容,可以省略")
}
*/
懶加載
- 1,懶加載方式一
- 這種方式是直接創建賦值,比如btn內部的屬性是不能在創建的時候進行賦值的
lazy var names = ["z","d","f"]
lazy var btn = UIButton()
- 2,懶加載方式二
- 這種方式是以閉包的形式進行創建,然后調用閉包執行,相當于把閉包當做參數,可以在閉包內部設置各種屬性,比如btn的frame,color等
lazy var names01 = { () -> [String] in
print("lazy")
let names = ["zhang","dan","feng"]
return names
}()
lazy var btn01 = { () -> UIButton in
print("btn-lazy")
let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
// btn.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
btn.backgroundColor = UIColor.red
return btn
}()