/*
闭包的定义:闭包是自包含的函数代码块,可以在代码中被传递和使用。
闭包能捕获和存储其所在上下文中任意常量和变量的引用。这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift2.0会管理在捕获过程中涉及到的所有内存操作
闭包采取如下三种形式之一:
*全局函数:一个有名字但不会捕获任何值的闭包
*嵌套函数;一个有名字可以捕获其封闭函数域内值的闭包
*闭包表达式:是一个利用轻量级语法所写的可以捕获起上下文中变量或常量值的匿名闭包。
闭包表达式拥有简洁的风格,Swift2.0鼓励开发者在常见场景中进行语法优化,主要优化如下:
*利用上下文推断参数和返回值类型
*隐式返回表达式闭包,即单表达式闭包可以省略return关键字
*参数名称的缩写
*挂尾闭包的使用
*/
//闭包表达式
/*1sorted函数(需要传入两个参数:
*已知类型的数组
*闭包函数,该闭包函数需要传入与数组类型相同的两个值,并返回一个布尔类型值来告诉sorted函数当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数 需要返回 true,反之返回 false。
该例子对一个 String 类型的数组进行排序,因此排序闭包函数类型需为 (String, String) -> Bool。
)*/
//提供闭包函数的一种方式是编写一个符合其类型要求的普通函数,并将其作为sort函数的第二个参数传入;
let city = ["beijing","shanghai","guangzhou","shenzhen","nanjing"]
func backwards(s1:String,s2:String)->Bool{
return s1 < s2
}
var newCity = city.sort(backwards)
/*
let city = [1,3,4,5,2,3,5,7,1,4,6]
func backwards(s1:Int,s2:Int)->Bool{
return s1 < s2
}
var newCity = city.sort(backwards)
*/
/*2使用闭包表达式,闭包表达式语法有如下一般形式:
没有函数名称{
(参数)->返回类型 in
代码段
}*/
var newCity2 = city.sort({
(s1:String,s2:String)->Bool in
return s1 > s2
})
print("\(newCity2)")
/*很明显,这里,我们就使用了闭包表达式,在“sort”方法里面,直接通过闭包表达式把上段代码中的定义的“func backward”
这个函数定义去掉了,简洁了对一个函数的定义,闭包的函数体部分由关键字in引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包的函数体即将开始*/
/*3根据上下文推断参数
因为排序闭包函数是作为sorted函数的参数进行传入的,所以swift2.0可以推断其参数和返回值的类型。sorted期望第二个参数类型为(String,String)->Bool的函数,因此实际上String,String和Bool类型并不需要作为闭包表达式定义中的一部分。因为所有的类型都可以被正确推断,返回箭头(->)和围绕在参数周围的括号也可以被省略
如:
*/
var newCity3 = city.sort({s1,s2 in
return s1 > s2
})
print("\(newCity3)")
/*4单表达式闭包省掉返回关键字,如果闭包的语句只有单行表达式,可以把return省略掉*/
var newCity4 = city.sort({
s1,s2 in
s1 > s2
})
print("\(newCity4)")
/*在这个例子中,“sorted”函数的第二个参数函数类型明确了闭包必须返回一 个 Bool 类型值。 因为闭包函数体只包含了一个单一表达式 “s1 > s2”,该表达 式返回 Bool 类型值,因此这里没有歧义,return 关键字可以省略。*/
/*5参数名称缩写,Swift2.0 自动为内联函数供了参数名称缩写功能,您可以直接通过 “$0,$1,$2”(0 是第一个参数)来顺序调用闭包的参数。如果在闭包表达式中使用参数名称缩写,可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进行推断。“in”关键字同样可以*/
var newCity5 = city.sort({
$0 > $1
})
print("\(newCity5)")
/*运算符函数:swift2.0的String类型定义了关于大于号“>”的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。而这正好与sorted函数的第二个参数需要的函数类型相符合,因此,可以简单的传递一个大于号,swift可以自动推断出你想使用大于号的字符串函数实现,如*/
var newCity6 = city.sort(>)
print("\(newCity6)")