美文网首页swift
swift——闭包

swift——闭包

作者: 阿凡提说AI | 来源:发表于2017-02-27 10:18 被阅读43次

    闭包的概念和定义

    一段程序代码通常由常量、变量和表达式组成,之后使用一对花括号“{}”来表示闭合并包裹着这些代码,由这对花括号包裹着的代码块就是一个闭包。

    {
          (参数名1:参数类型,参数名2:参数类型...)->返回值类型  in
          闭包函数体
          return 返回值
    }
    

    不能在闭包参数中设置默认值。

    let sumFunc = {
            (x:Int,y:Int)->Int
            in
            return x+y
    }
    
    print(sumFunc(10,20))
    

    如果一个闭包没有参数和返回值,那么基本格式中的参数列表、返回值、in都可以省略掉,这就是最简单的闭包

    let simpleFunc = {
        print("这是最简单的闭包")
    }
    

    使用尾随闭包

    在Swift开发中,尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持其作为最后一个参数调用。

    fun calculate(opr:String,funN:(Int,Int)->Int){
        switch(opr){
                case "+":
                    print("10+5=\(funN(10,5))")
                 default:
                    print("10-5=\(funN(10,5))")
         }
    }
    

    调用calculate

    calculate(opr:"+",funN:{(a:Int,b:Int)->Int in return a+b})
    calculate(our:"-",{(a:Int,b:Int)->Int in return a+b})
    

    第一行代码传入funN参数比较长,为此,可以通过第2行代码的调用方式,将小括号提前到闭包表达式前面,闭包表达式位于括号的外面,这种形式就是尾随闭包。
    注意:
    要使用尾随闭包,则闭包必须是参数列表的最后一个参数,如果不是最后一个的话,是无法使用尾随闭包写法的。

    使用闭包表达式

    1.根据上下文推断类型

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

    Swift能够推断出参数a和b都是Int类型的,返回值也是Int类型的。

    {a,b in return a+b}
    

    eg:

    fun calculate(our:String)->(Int,Int)->Int{
         var result:(Int,Int)->Int
        switch(opr){
                case "+":
                    result = {a,b in return a+b}
                 default:
                    result = {a,b in return a-b}
         }
    }
    
    let f1:(Int,Int)->Int = calculate(opr:"+")
    print("10+5 = \(f1(10,5))")
    let f2:(Int,Int)->Int = calculate(opr:"-")
    print("10-5 = \(f2(10,5))")
    

    2.单行闭包表达式可以省略return关键字
    代码形式如下:

    {a,b in a+b}
    

    eg:

    fun calculate(our:String)->(Int,Int)->Int{
         var result:(Int,Int)->Int
        switch(opr){
                case "+":
                    result = {a,b in a+b}
                 default:
                    result = {a,b in a-b}
         }
    }
    
    let f1:(Int,Int)->Int = calculate(opr:"+")
    print("10+5 = \(f1(10,5))")
    let f2:(Int,Int)->Int = calculate(opr:"-")
    print("10-5 = \(f2(10,5))")
    

    3.参数名称缩写
    Swift提供了参数名称 缩写功能。用$0、$1、$2来表示调用闭包中参数,$0指代第1个参数,$1指代第2个参数,以此类推,$n指代第n+1个参数。

    fun calculate(our:String)->(Int,Int)->Int{
         var result:(Int,Int)->Int
        switch(opr){
                case "+":
                    result = {$0+$1}
                 default:
                    result = {$0-$1}
         }
    }
    
    let f1:(Int,Int)->Int = calculate(opr:"+")
    print("10+5 = \(f1(10,5))")
    let f2:(Int,Int)->Int = calculate(opr:"-")
    print("10-5 = \(f2(10,5))")
    

    4.使用闭包返回值
    可以直接在表达式中使用闭包的返回值

    let c1:Int = {(a:Int,b:Int)->Int in
                            return a+b}(10,5)
    print("10+5=\(c1)")
    

    捕获

    嵌套函数或者闭包可以在其定义的上下文中捕获常量或者变量,即使定义的这些常量或变量的原作用域已经不存在,仍然可以在闭包函数体内引用和修改这些常量或变量,这种机制被称为捕获。

    fun makeArray()->(String)->[String]{
          var array:[String] = [String]()
           fun addElement(element:String)->[String]{
                  array.append(element)
                  return array
            }
            return addElement
    }
    
    let f1 = makeArray()
    print("---f1---")
    print(f1("张三"))
    print(f1("李四"))
    print(f1("王五"))
    

    相关文章

      网友评论

        本文标题:swift——闭包

        本文链接:https://www.haomeiwen.com/subject/uwoowttx.html