Swift-闭包的使用和总结

来源:互联网 发布:剩余windows重置计数2 编辑:程序博客网 时间:2024/05/18 16:14

一、闭包的特点

  • 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