Swift中的闭包

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()
})
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值