闭包是功能性自包含模块,可以在代码中被传递和使用。与objective-c中的block比较类似。
闭包有三种形式:
1、全局函数2、嵌套函数
3、闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包
闭包表达式是一种利用简洁语法构建内联闭包的方式。 闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了。
闭包的一般形式:
{ (parameters) -> return type in statements }
以swift提供的sort函数为例:
对一个数组进行排序:
普通函数的做法是:
let names = ["Chris","Alex","Ewa","Barry","Daniella"] func backwards(s1 : String,s2 : String) -> Bool { return s1 > s2 } var reserve = sorted(names,backwards) println(reserve)
得到的输出为:
[Ewa,Daniella,Chris,Barry,Alex]
使用闭包表达式的代码为:
var reserved = sorted(names,{(s1 : String,s2 : String) -> Bool in return s1 > s2 }) println(reserved)
得到的输出为:
[Ewa,Alex]
相当于把backwards函数作为一个参数传给了sorted函数,函数和返回值类型都应该写在大括号内。闭包的函数体部分由in关键字引入,in后面就是代表该闭包的函数体部分。
swift函数有类型推断的功能,排序闭包又是作为函数的参数传入的,那么swift可以推断出它的参数和返回值类型,那么sorted函数可以改写为:
var reserved1 = sorted(names,{s1,s2 in return s1 > s2}) println(reserved1)
我们可以看出得出的结果还是一样的。
单行表达式闭包可以通过隐藏return关键字来隐式返回表达式的结果。那么上面的代码可以改写为:
var reserved2 = sorted(names,s2 : String) -> Bool in s1 > s2 }) println(reserved2)
参数名简写:
swift自动为内联函数提供了参数名简写功能,可以直接通过$0 $1 $2等名字来引用的闭包的参数的值。
用字符串排序的时候,系统对”>”符号总报有歧义这个错误,用int数据来排序就没问题了。
let intNumbers = [2,3,4,5] var reserved3 = sorted(intNumbers,{ $0 > $1 }) println(reserved3)
得到的结果是:
[5,2]希望大家共同学习。