闭包是自包含的函数代码块,可以在代码中使用或者用来作为参数传值。Swift中的闭包和OC中的blocks比较相似。
闭包可以捕获和存储所在上下文中任意常量和变量的引用。这就是闭合并包裹着这些常量和变量,俗称闭包。
闭包有三种形式:
1)全局函数是一个有名字但不会捕获任何值的闭包;
2)嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包;
3)闭包表达式是一个可以捕获其上下文中变量或常量值的匿名闭包。
全局函数和嵌套函数都是特殊的闭包!!!
在此,我们重点讲的是:闭包表达式。
闭包表达式的表现形式非常灵活,下面会逐条列举:
a、根据上下文推断参数和返回值类型;
b、单表达式闭包隐式返回,即:如果闭包体只有一行代码,可以省略return
c、可以使用简化参数名,如:��0,��1(从0开始,表示第i个参数)
d、提供尾随闭包语法
全局函数是一种特殊的闭包
var names = ["Chris", "Alex", "Ewa", "Barry","Daniella"]
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
let reversed = names.sort(backwards)
print(reversed)
//打印结果:["Ewa", "Daniella", "Chris", "Barry", "Alex"]
函数backwards作为sort()的参数传递进去,满足闭包的定义——
闭包是自包含的函数代码块,可以在代码中使用或者用来作为参数传值。
我们可以清晰得看出来全局函数是一种特殊的闭包。
闭包表达式的一般形式
{(parameters) -> returnType in
statements
}
var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({(s1:String,s2:String) -> Bool in return s1>s2})
//myNames最后为:["Ewa", "Daniella", "Chris", "Barry", "Alex"]
闭包表达式,简写方式一:根据上下文推断参数和返回值类型
var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({s1,s2 in return s1>s2})
//myNames最后为:["Ewa", "Daniella", "Chris", "Barry", "Alex"]。
//此闭包表达式省略了参数类型和返回值类型!
闭包表达式,简写方式二:单表达式闭包隐式返回
var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({s1,s2 in s1>s2})
//myNames最后为:["Ewa", "Daniella", "Chris", "Barry", "Alex"]。
//此闭包表达式只有一行代码,省略了return关键字!
闭包表达式,简写方式三:参数名称缩写
Swift自动为内联函数提供了参数名称缩写功能,您可以直接通过
0,1,$2…来顺序调用闭包的参数。
如果您在闭包表达式中使参数名称缩写,您可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进推断。 in关键字也同样可以被省略。
var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({$0>$1})
//myNames最后为:["Ewa", "Daniella", "Chris", "Barry", "Alex"]。
//此闭包表达式只有一样代码,省略了return关键字!
闭包表达式,简写方式四:尾随闭包
如果一个闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。
var names =["Chris","Alex","Ewa","Barry","Daniella"]
let myNames = names.sort({s1,s2 in s1>s2})
对于上面这行代码,尾随闭包的写法如下:
let myNames = names.sort(){s1,s2 in s1>s2}
还有哦,如果函数参数只有一个,那么函数后面的括号都可以省略。
let myNames = names.sort{s1,s2 in s1>s2}
//好吧,括号省略掉了!闭包的表达方式还真是灵活!!!