Swift中的闭包

来源:互联网 发布:五五开拉黑淘宝权 编辑:程序博客网 时间:2024/05/17 02:26

Swift中的闭包和OC中的block非常相似
OC中的block是匿名的函数;
Swift中的闭包是一个特殊的函数;
block和闭包都经常用于回调

先学习Swift的闭包,必须先搞清楚OC中的block

同样写一个网络请求工具类

//  HttpTool.swiftimport UIKitclass 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.swiftimport UIKitclass 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()})
0 0
原创粉丝点击