Swift编程基础(五):闭包

闭包是自包含的函数代码块,可以在代码中使用或者用来作为参数传值。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}
//好吧,括号省略掉了!闭包的表达方式还真是灵活!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章