闭包
闭包是可以在你的代码中被传递和引用的功能性独立代码块。
闭包能够捕获和存储定义在其上下文中的任何常量和变量的引用,这也就是所谓的闭 合并包裹那些常量和变量,因此被称为“闭包”,Swift 能够为你处理所有关于捕获的内存管理的操作。
// 定义闭包
类型 : (形参) -> (返回值)
// 闭包执行回调
类型(值)
// 闭包实现回调
{
(形参) -> (返回值) in
// 执行代码
}
简单举个例子:在方法中定义闭包实现回调传值。
### WJKHttpTool.swift
import Foundation
class WJKHttpTool : NSObject {
// MARK:定义闭包
func loadData(completion : (_ result : Bool) -> ()) -> () {
// MARK:闭包执行回调
completion(true)
}
}
### WJKViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let httpTool : WJKHttpTool = WJKHttpTool()
// MARK:闭包实现回调
httpTool.loadData (completion: { (result) -> () in
print(result)
})
}
尾随闭包:
- 如果闭包是函数的最后一个参数,则可以将闭包写在 () 后面。
- 如果函数只有一个参数,并且这个参数是闭包,那么 () 可以不写。
上述闭包则为尾随闭包则可以写成
httpTool.loadData() { (result) -> () in
print(result)
}
当然开发中建议(包括代码中敲回车代码补全)写成
httpTool.loadData { (result) -> () in
print(result)
}
扩展
- 如果闭包没有参数,没有返回值部分内容可以省略
如上述例子中没有返回值则可以写成
httpTool.loadData (completion: { (result) in
print(result)
})
当然如果是尾随闭包则可以写成
httpTool.loadData { (result) in
print(result)
}
// 所以上述写法就是最简写法(官方推荐写法)了
- 解决循环引用
httpTool.loadData {[weak self] (result) in
print(result)
self?.view.backgroundColor = UIColor.white
}