閉包
- 閉包類(lèi)似于 OC 中的 Block,是一段預(yù)先定義好的代碼,在需要時(shí)執(zhí)行
定義
- 體驗(yàn)UIView動(dòng)畫(huà)閉包
//: () -> Void 表示一個(gè) `不需要參數(shù),返回值為空` 的閉包類(lèi)型
UIView.animateWithDuration(0) { () -> Void in
//
}
- 閉包表達(dá)式格式:
{ (形參名稱(chēng)1: 形參類(lèi)型1, 形參名稱(chēng)2: 形參類(lèi)型2, ...) -> 返回值 `in`
//要執(zhí)行的代碼
}
in 用于區(qū)分閉包定義和代碼實(shí)現(xiàn)
- 定義閉包
// 定義閉包
var closure = { (text: String) -> Void in
}
- 調(diào)用閉包
// 調(diào)用閉包
closure("學(xué)習(xí)閉包")
閉包使用場(chǎng)景(回調(diào))
- 模擬耗時(shí)操作
// 閉包的使用場(chǎng)景: 回調(diào)
// 在子線程執(zhí)行完任務(wù)后通知調(diào)用者
func loadData(finished: (result: String) -> Void) {
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
print("拼命加載數(shù)據(jù): \(NSThread.currentThread())")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
print(": \(NSThread.currentThread())")
// 通知調(diào)用者
finished(result: "獲取到20條數(shù)據(jù)")
})
}
}
- 調(diào)用
loadData { (result) -> Void in
print("網(wǎng)絡(luò)請(qǐng)求完成: \(result)")
}
閉包的簡(jiǎn)寫(xiě)
// 當(dāng)閉包的參數(shù)和返回都為空時(shí)可以省略 () -> Void in
UIView.animateWithDuration(1) {
}
// 閉包是最后一個(gè)參數(shù),可以把閉包放在()后面,尾隨閉包
UIView.animateWithDuration(1) { () -> Void in
}