• 9 闭包——《Swift3.0从入门到出家》


    8  闭包

     

    Swift语言中可以使用一块独立代码块替代函数的定义,称独立的代码块为闭包

    闭包格式为:

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

    执行语句

    }

    例子:

    <1>使用闭包实现两个数的和

    var sum:(Int,Int) ->Int = {(a:Int, b:Int)->Int in return a + b}

    <2>使用闭包实现一个整数和一个字符串的拼接,将拼接的结果返回

    var append  = {(num:Int,str:String) ->String in return “(num)” + str}

    <3>使用闭包实现数组升序排序(借用上节的排序函数)

    sortArr(&array,method:{(num1:Int,num2:Int)->Bool in return num1 > num2})

    当函数的形参是函数类型时,形参的传值直接使用闭包完成

    <4>使用闭包获取数组中大于0的数据个数

    let count  = {(arr:[Int])->Int in 

    var n = 0

    for i  in arr{

    if i > 0{

    n += 1

    }

    }

    return count

    }

    var array = [10,2,3,-3,3,-4]

    print(count(array))

     

     

    闭包的简化(closure)

    <1>当执行语句只有一个表达式的时候 return可以省略

    var closure  = {(a:Int,b:Int)->Int in 

    a > b ?  a : b

    }

    <2>当执行语句只有一个表达式而且表达式的结果类型可以推断出来,那么return关键字和返回值类型可以同时缺省

    var closure = {(a:Int,bInt) in

    a > b ? a : b

    }

    <3>当参数的类型已知,并且满足上述两个条件的时候,参数的名称可以缺省,参数的类型可以缺省,返回值类型可以缺省,return关键字可以缺省,in也可以缺省

     

    var closure: (Int,Int)->Int = {$0  > $1 ? $0 : $1}

     

    <4>当参数个数为两个,并且满足<3>的条件,闭包中直接添加运算符号就可以

    sortArr(&array,method: <)

     

    尾随闭包

    当函数最后一个形参是函数类型的变量,对函数类型的变量赋值的时候需要使用闭包,那么闭包传值的书写位置可以放在所有参数列表之外,不放在参数列表的最后位置,我们称这种写法为尾随闭包

     

    比如上节提到的排序可以写成:sortArr(&arr){$0 > $1}

    例子:定义函数实现两个数的差和和

    func sumAAndB(a:Int,b:Int,mehod:(Int,Int)->Int){

    print(method(a,b))

    }

    sumAAndB(10,b:20,method:{(a:Int,b:Int)->Int in //初始写法

    return a + b

    })

    sumAAndB(100,b:200,method: - ) //简化后的闭包

    sumAAndB(0,b:10){$0 - $1} //写成尾随闭包

    扩展

    自动闭包: 函数的形参是函数类型 在函数类型的形参前添加@autoclosure 向该形参传递的闭包 就被称为自动闭包

     

    自动闭包使用的条件:函数的参数列表为空 ()->返回值类型

     

    //定义函数为数组赋值

    func createArr(count: Int,@autoclosure function:()->Int)->[Int] {

        //count 表示数组的元素个数

      //function 一个函数类型的参数 在function指向的函数中对数组的每一个元素赋值 数组的元素都是Int类型 所以将赋的每一个值反馈回来 添加到新的数组中

        var dataArr: [Int] = []

        for _ in 0..<count {

            dataArr.append(function())

        }

        return dataArr

    }

    print(createArr(5, function:Int(arc4random()) % 100))

     

    自动闭包就是 编译器自动将表达式转化成闭包

  • 相关阅读:
    mysql安装
    Apache 403 错误解决方法-让别人可以访问你的服务器
    windows安装xampp时出现,unable to realloc xxxxxxxx bytes
    spring-mvc整合jquery cropper图片裁剪插件
    Android 贝塞尔曲线
    Android 桌面生成快捷方式
    Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to “*****”
    Android TextView 字符串展示不同大小文字
    Android 6.0权限问题
    Android 部分机型GridView四周默认间距
  • 原文地址:https://www.cnblogs.com/zhyunfe/p/5842040.html
Copyright © 2020-2023  润新知