Swift-闭包

来源:互联网 发布:js非空提示 编辑:程序博客网 时间:2024/05/02 12:19

  闭包表达式

 {

    (参数) ->返回值类型 in

    执行语句

 }

/* 1、 闭包表达式 {    (参数) -> 返回值类型 in    执行语句 } */print("1、 闭包表达式")let sayHello = {    print("hello")}sayHello()let add:(Int,Int) -> Int = {    (a:Int,b:Int) -> Int in    return a+b}print(add(3,2))/* 2、 闭包表达式作为函数回调 { (参数) -> 返回值类型 in 执行语句 } */print("\n2、 闭包表达式作为函数回调")func showArray(array:[Int]){//    for i in array{//        print("\(i) ")//    }    print(array)}//冒泡排序//func bubbleSort(array:inout [Int]){//    for i in 1 ..< array.count//    {//        for j in 0 ..< array.count - i//        {//            if array[j] > array[j+1]//            {//                let t = array[j]//                array[j] = array[j + 1]//                array[j+1] = t//            }//        }//    }//}func bubbleSort(array:inout [Int],cmp:(Int,Int) -> Int){    for i in 1 ..< array.count    {        for j in 0 ..< array.count - i        {            if cmp(array[j],array[j+1]) == -1            {                let t = array[j]                array[j] = array[j + 1]                array[j+1] = t            }        }    }}var arr = [20,30,4,5,80]showArray(array:arr)let intCmp:(Int,Int) -> Int = {    (a:Int,b:Int) -> Int in    if a>b{        return -1    }else if a<b {        return 1    }    else{        return 0    }}//bubbleSort(array: &arr)//bubbleSort(array: &arr,cmp:intCmp)//闭包表达式优化(类型推断机制--根据已经定义好的参数、返回值类型进行省略,且可以使用$符号进行参数省略,即 $0: 表示第一个参数)bubbleSort(array:&arr,cmp:{    if $0>$1 {        return -1    }else if $0<$1 {        return 1    }    else{        return 0    }})showArray(array: arr)//.sort-系统冒泡排序arr.sort{    (a:Int,b:Int) -> Bool in    return a>b}showArray(array: arr)/* 3、嵌套函数 */print("\n3、嵌套函数")func swap(a:inout Int,b:inout Int){    let t = a    a = b    b = t}//冒泡排序func bubbleSortFunc(array:inout [Int]){    for i in 1 ..< array.count    {        for j in 0 ..< array.count - i        {            if array[j] > array[j+1]            {                swap(a:&array[j], b:&array[j+1])            }        }    }}bubbleSortFunc(array: &arr)showArray(array: arr)/* 4、闭包捕获值 */print("\n4、闭包捕获值")//嵌套函数func getFuncValue(inc:Int) -> (Int) -> Int{    //内部函数(局部的),捕获了上下文的值    var m = 10 //对值进行保存并增加    func inFunc(v:Int) -> Int{        //var m = 10 //写在里面值不会被保存增加        m += 1        return inc+v+m    }    return inFunc}let getFunc1 = getFuncValue(inc: 2)let getFunc2 = getFuncValue(inc: 2)//每个函数都有自己独有的一份闭包print(getFunc1(10))//这时将m = 11当成了一个全局变量进行保存,因此值在不断增加print(getFunc1(10))print(getFunc2(10))


2 0