Swift中的闭包表达式很灵活,其标准语法格式以下:
{ (参数列表) ->返回值类型 in
语句组
}
其中,参数列表与函数中的参数列表形式同样,返回值类型相似于函数中的返回值类型,但不一样的是后面有in关键字。
Swift提供了多种闭包简化写法,这一节咱们将介绍几种不一样的形式。
1.类型推断简化
类型推断是Swift的强项,Swift能够根据上下文环境推断出参数类型和返回值类型。如下代码是标准形式的闭包:
{(a:Int, b:Int) -> Int in
return a + b
}
Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式以下:
{a, b in return a + b }
使用这种简化方式修改后的示例代码以下:
php
[html] view plaincopyhtml
func calculate(opr :String)-> (Int,Int)-> Int { swift
var result : (Int,Int)-> Int 微信
switch (opr) { 闭包
case "+" : 函数
result = {a, b in return a + b } ① 网站
default: spa
result = {a, b in return a - b } ② .net
} orm
return result;
}
let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")
let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")
上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
2.隐藏return关键字
若是在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return能够省略,省略形式以下:
{a, b in a + b }
使用这种简化方式修改后的示例代码以下:
[html] view plaincopy
func 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;
}
上述代码第①行和第②行的闭包return关键字省略了,须要注意的是,省略的前提是闭包中只有一条return语句。下面这样有多条语句是不容许的。
{a, b in var c; a + b }
3.缩写参数名称
上一节介绍的闭包表达式已经很简洁了,不过,Swift的闭包还能够再进行简化。Swift提供了参数名称缩写功能,咱们能够用$0、$一、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。
使用参数名称缩写,还能够在闭包中省略参数列表的定义,Swift可以推断出这些缩写参数的类型。此外,in关键字也能够省略。参数名称缩写以后以下所示:
{$0 + $1}
使用参数名称缩写修改后的示例代码以下:
[html] view plaincopy
func calculate(opr :String)-> (Int,Int)-> Int {
var result : (Int,Int)-> Int
switch (opr) {
case "+" :
result = {$0 + $1} ①
default:
result = {$0 - $1} ②
}
return result;
}
let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")
let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")
上述代码第①行和第②行的闭包采用了参数名称缩写。
4.使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,咱们能够直接在表达式中使用闭包的返回值。从新修改add和sub闭包,示例代码以下:
[html] view plaincopy
let c1:Int = {(a:Int, b:Int) -> Int in
return a + b
}(10,5) ①
println("10 + 5 = \(c1)")
let c2:Int = {(a:Int, b:Int) -> Int in
return a - b
}(10,5) ②
println("10 - 5 = \(c2)")
上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。可是闭包表达式不能直接赋值给c1,由于c1是Int类型,须要闭包的返回值。这就须要在闭包结尾的大括号后面接一对小括号(10,5),经过小括号(10,5)为闭包传递参数。第②行代码也是如此。经过这种方法能够为变量和常量直接赋值,在有些场景下使用很是方便。
更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485
欢迎关注智捷iOS课堂微信公共平台