Swift中的闭包和OC中的block非常相似
OC中的block是匿名的函数;
Swift中的闭包是一个特殊的函数;
block和闭包都经常用于回调
先学习Swift的闭包,必须先搞清楚OC中的block
同样写一个网络请求工具类
// HttpTool.swift
import UIKit
class HttpTool: NSObject {
var callBack: ((jsonData:String)->())?
// 闭包的类型:(参数列表) -> (返回值类型)
func loadData(callBack: (jsonData:String) -> ()){
self.callBack = callBack
dispatch_async(dispatch_get_global_queue(0, 0)) {
print("发送网络请求:\(NSThread.currentThread())")
dispatch_async(dispatch_get_main_queue(), {
print("获取到数据并且进行回调:\(NSThread.currentThread())")
// 执行回调函数
callBack(jsonData: "jsonData")
})
}
}
}
// ViewController.swift
import UIKit
class ViewController: UIViewController {
var tools : HttpTool = HttpTool()
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
weak var weakSelf = self
tools.loadData { (jsonData) in
// print("在ViewController中拿到数据:\(jsonData)")
// weakSelf?.view 表示前面的可选类型没有值后面的代码不会执行
// 如果前面的可选类型有值,系统会自动将weakSelf进行解包并且使用
weakSelf?.view.backgroundColor = UIColor.redColor()
}
}
// 相当于OC中的dealloc方法,
deinit {
print("ViewController ---- deinit")
}
}
上面解决循环引用问题的方式是定义:
weak var weakSelf = self
还有第二种解决循环引用的方式(推荐):
tools.loadData {[weak self] (jsonData) in
self?.view.backgroundColor = UIColor.redColor()
}
第三种方式:
tools.loadData {[unowned self] (jsonData) in
self.view.backgroundColor = UIColor.redColor()
}
尾随闭包的概念
如果我们的闭包作为方法的最后一个参数,那么这个方法可以把小括号()省略
上面我们我们的loadData()方法就省略了小括号。
tools.loadData( {[weak self] (jsonData) in
self?.view.backgroundColor = UIColor.redColor()
})
2001

被折叠的 条评论
为什么被折叠?



