[swift]8.0闭包

                              闭包

1: Swift闭包定义:闭包是自包含的匿名函数代码块,可以作为表达式,函数参数和函数返回值。闭包表达式的运算结果是一种函数类型。Swift中的闭包可以捕获和存储其所在上下文环境中的常量和变量,然后进行一系列的简化。
2:格式 swift的闭包表达式很灵活,其标准语法格式如下:
{(参数列表)->返回值类型 in
语句组
}
其中参数列表与函数参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
3:类型推断简化
类型推断简化是swift的强项,swift可以根据上下文环境推断出参数类型和返回值类型,以下代码是标准形式的闭包:
{(a:Int,b:Int)->Int in
return a+b
}
swift能推断出参数a和b是Int类型,返回值也是Int 类型,简化形式如下:
{(a,b)in return a+b }
{a,b in return a+b} //参数列表括号也可以省略
4:隐藏return关键字
如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略。省略形式如下:
{ a,b in a + b}
注意:省略的前提是闭包中只有一条return 语句,下面这种有多条语句的情况下是不允许的:
{a , b in var c = 0; a + b} 这个是错误的
5:省略参数名
前面的闭包表达式已经很简洁了,不过swift闭包还可以再进行简化。Swift提供了参数名省略功能,我们可以用 0 1、 2...... 0指代第一个参数,$1指代第二个参数,以此类推。使用参数名省略功能,在闭包中必须省略参数列表定义,swift能够推断出这些缩写参数的类型。参数列表省略了,in 关键字也需省略。
对比如下:
~~
result = {
(a: Int ,b:Int ) -> Int in
Return a - b
}
省略参数名之后变为:
~

result = { 0 1}

6:使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。理解闭包返回值有一个窍门,就是将闭包部分看成一个函数。如图所示把灰色部分替换为函数,那么函数调用时后面是小括号的参数列表。
例1:Let c1: Int = {(a:Int , b:Int ) ->Int in
return a - b
}(10,5)
上述代码有两个表达式,第一行是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1 ,因为c1是Int型,需要闭包的返回值,这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。通过这种方法可以直接为变量和常量赋值,这在有些情况下使用起来非常方便。
7:使用尾随闭包
闭包表达式可以作为函数的参数传递,如果闭包表达式很长,就会影响程序的可读性,尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。
例2: func calculate (opr: String , funN:(Int ,Int )-> Int ){
~~
}
caculate(“+”,funN:{(a: Int ,b: Int)-> Int in return a + b } )
Caculate(“+”) { (a: Int ,b: Int ) ->Int in return a + b}
Caculate (“+”) { 0 + 1}

第一行定义了caculate 函数,其中最后一个参数funN是(Int ,Int )->Int 函数类型,funN可以接受闭包表达式,省略部分是调用过程,{(a: Int ,b: Int)-> Int in return a + b }是传递的参数,这个参数很长,我们可以使用灰色部分代码形式,将闭包表达式移到()之外,这种形式就是尾随闭包。
注:如果闭包表达式不是最后一个参数,就不能使用尾随闭包写法了。
如:例2: func calculate (opr: String, funN:(Int ,Int )-> Int )中的opr: String与funN:(Int ,Int )-> Int交换位置 ,变成func calculate( funN:(Int ,Int )-> Int,opr: String),其中闭包表达式不是最后一个参数,就不能使用尾随闭包写法了。
8:区分函数与闭包
闭包中往往有一些关键字,例如in,还有缩写参数 0, 1 ……等等,这些特征是在函数中没有的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值