Swift-闭包的使用和总结

一、闭包的特点

  • 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)
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值