一、闭包的特点
- 1 预先定义好的代码
- 2 在需要的时候执行
- 3 可以当做参数传递
- 4 可以有返回值
- 5 包含self的时候,需要注意循环引用
二、闭包的定义格式
闭包 = {(形参) -> (返回值) in // 代码实现 }
in 用于区分函数定义和代码实现
三、闭包的分类
- 无参无返回值的闭包
- 有参无返回值的闭包
- 无参有返回值的闭包
- 有参有返回值的闭包
四、简单的闭包定义和调用
let block_F = { (str: String)->() in
print(str)
}
/// 闭包的调用
block_F("Good Luck 2017")
/// 最简单的闭包
/// 对于无参无返回值的闭包,"()->()" 可以省略
let block_G = {
print("你好 2017")
}
/// 执行闭包
block_G()
五、闭包在实际开发中的的使用
1、定义闭包属性
/// 无参无返回值的闭包
var block_A:(()->())?
/// 有参(一个)无返回值的闭包
var block_B:((String)->())?
/// 有参(多个)无返回值的闭包
var block_C:((String,String)->())?
/// 无参有返回值的闭包
var block_D:(()->(Int))?
/// 有参有返回值的闭包
var block_E:((Int)->(Int))?
2、初始化闭包属性
block_A = {
print("Hello 2017")
}
/// 注意:参数后面的"->()"可以省略
block_B = { (str: String)->() in
print("接受到的数据 \(str)")
}
block_C = { (str1: String,str2: String)->() in
print("接受到的数据 \(str1) \(str2)")
}
/// 注意:没有参数的闭包 参数前面的"()->)"不可以省略
block_D = { ()->(Int) in
return 100
}
block_E = { (num: Int)->(Int) in
return num * 100
}
3、判断并定义执行闭包的函数
private func executeBlcok_A() {
/// 判断闭包是否存在
if let block_A = block_A {
block_A()
}
}
private func executeBlcok_B() {
/// 判断闭包是否存在
if let block_B = block_B {
block_B("GoodBye 2016")
}
}
private func executeBlcok_C() {
/// 判断闭包是否存在
if let block_C = block_C {
block_C("GoodBye 2016","Hello 2017")
}
}
private func executeBlcok_D() {
/// 判断闭包是否存在
if let block_D = block_D {
let result = block_D()
print(result)
}
}
private func executeBlcok_E() {
/// 判断闭包是否存在
if let block_E = block_E {
let result = block_E(8)
print(result)
}
}
4、闭包方法的执行以及闭包的执行
executeBlcok_A()
executeBlcok_B()
executeBlcok_C()
executeBlcok_D()
executeBlcok_E()
5、执行结果
image
六、闭包作为函数的函数进行回调
/// 闭包作为函数的函数进行回调
///
/// - Parameters:
/// - page: 参数
/// - complete: 完成后的回调
private func getDataFromNetwork(page: Int,complete:@escaping ((AnyObject?,Bool?)->())){
/// 异步加载数据
DispatchQueue.global().async {
/// ...
/// ...
/// 回到主线程
DispatchQueue.main.async {
/// 模拟网络请求结果
let result: Bool = page > 0
if result { /// 如果请求成功,返回数据,
let dict: [String: AnyObject] = Dictionary()
complete(dict as AnyObject,true)
} else { /// 如果请求失败,返回数据结果
complete(nil,false)
}
}
}
}
七、闭包作为函数的函数传递
/// 定义函数-1
///
/// - Parameter finished: 回调结果
private func getDataFromService(finished:((Bool)->())) {
/// 闭包作为参数传递给下一个函数-2
calculation(result: finished)
}
/// 定义函数-2
///
/// - Parameter result: 回调结果
private func calculation(result:((Bool)->())){
result(true)
}