zoukankan      html  css  js  c++  java
  • 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))

     

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

  • 相关阅读:
    SharePoint 2013 安装.NET Framework 3.5 报错
    SharePoint 2016 配置工作流环境
    SharePoint 2016 站点注册工作流服务报错
    Work Management Service application in SharePoint 2016
    SharePoint 2016 安装 Cumulative Update for Service Bus 1.0 (KB2799752)报错
    SharePoint 2016 工作流报错“没有适用于此应用程序的地址”
    SharePoint 2016 工作流报错“未安装应用程序管理共享服务代理”
    SharePoint JavaScript API in application pages
    SharePoint 2016 每天预热脚本介绍
    SharePoint 无法删除搜索服务应用程序
  • 原文地址:https://www.cnblogs.com/zhyunfe/p/5842040.html
Copyright © 2011-2022 走看看