swift——闭包

闭包的概念和定义

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

{
      (参数名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(opr:"-",{(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(opr: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}
     }
     return result
}

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 中的闭包与 C 和 Objective-C 中的代...
    穷人家的孩纸阅读 1,730评论 1 5
  • 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这被称为关闭这些常量和变量。 Swift处理所有的...
    Joker_King阅读 597评论 0 2
  • Swift 中的闭包是自包含的函数代码块,可以在代码中被传递和使用。类似于OC中的Block以及其他函数的匿名函数...
    乔克_叔叔阅读 529评论 1 3
  • 闭包是自包含的代码块,可以在代码中被传递和使用。Swift中的闭包与C和Objective-C中代码块(block...
    Raaaaamsey阅读 854评论 0 2
  • * 闭包 是自包含的函数代码块,可以在代码中被传递和使用。swift中的闭包和Objective-C中的代码块(b...
    EndEvent阅读 865评论 4 8