閉包
閉包是可以在你的代碼中被傳遞和引用的功能性獨(dú)立代碼塊轻腺。
閉包能夠捕獲和存儲(chǔ)定義在其上下文中的任何常量和變量的引用,這也就是所謂的閉 合并包裹那些常量和變量炮叶,因此被稱為“閉包”透葛,Swift 能夠?yàn)槟闾幚硭嘘P(guān)于捕獲的內(nèi)存管理的操作。
// 定義閉包
類型 : (形參) -> (返回值)
// 閉包執(zhí)行回調(diào)
類型(值)
// 閉包實(shí)現(xiàn)回調(diào)
{
(形參) -> (返回值) in
// 執(zhí)行代碼
}
簡(jiǎn)單舉個(gè)例子:在方法中定義閉包實(shí)現(xiàn)回調(diào)傳值美澳。
### WJKHttpTool.swift
import Foundation
class WJKHttpTool : NSObject {
// MARK:定義閉包
func loadData(completion : (_ result : Bool) -> ()) -> () {
// MARK:閉包執(zhí)行回調(diào)
completion(true)
}
}
### WJKViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let httpTool : WJKHttpTool = WJKHttpTool()
// MARK:閉包實(shí)現(xiàn)回調(diào)
httpTool.loadData (completion: { (result) -> () in
print(result)
})
}
尾隨閉包:
- 如果閉包是函數(shù)的最后一個(gè)參數(shù),則可以將閉包寫在 () 后面摸航。
- 如果函數(shù)只有一個(gè)參數(shù)制跟,并且這個(gè)參數(shù)是閉包,那么 () 可以不寫酱虎。
上述閉包則為尾隨閉包則可以寫成
httpTool.loadData() { (result) -> () in
print(result)
}
當(dāng)然開(kāi)發(fā)中建議(包括代碼中敲回車代碼補(bǔ)全)寫成
httpTool.loadData { (result) -> () in
print(result)
}
擴(kuò)展
- 如果閉包沒(méi)有參數(shù)雨膨,沒(méi)有返回值部分內(nèi)容可以省略
如上述例子中沒(méi)有返回值則可以寫成
httpTool.loadData (completion: { (result) in
print(result)
})
當(dāng)然如果是尾隨閉包則可以寫成
httpTool.loadData { (result) in
print(result)
}
// 所以上述寫法就是最簡(jiǎn)寫法(官方推薦寫法)了
- 解決循環(huán)引用
httpTool.loadData {[weak self] (result) in
print(result)
self?.view.backgroundColor = UIColor.white
}