您的位置:首页 > 移动开发 > Swift

swift 闭包

2017-03-07 13:41 141 查看

闭包

闭包是自包含的函数代码块,可以在代码中被传递和使用。swift中的闭包与c和oc中的代码块以及其他一些编程语言中的匿名函数比较相似。

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。swift会为你管理在捕获过程中涉及到的所有内存操作。

闭包表达式

闭包表达式是一种利用简洁语法构建内联闭包的方式。闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了。下面闭包表达式的例子通过使用几次迭代展示了sorted(by:)方法定义和语法优化的方式。每一次迭代都用更简洁的方式描述了相同的功能。

sorted方法

swift标准库提供了名为sorted(by:)的方法,他会根据你所提供的用于排序的闭包函数将已知类型数组中的值进行排序。一旦排序完成,sorted(by:)方法会返回一个与原数组大小相同,包含同类型元素且元素已经正确排序的新数组。原数组不会被sorted(by:)方法修改。

let names = ["chris","alex","ewa","barry"]
func backward(_ s1:String ,_ s2:String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
print(reversedNames)


闭包表达式语法

闭包表达式参数可以是in-out参数,但不能设定默认值。也可以使用具名的可变参数(但如果可变参数不放在参数列表的最后一位的话,调用闭包的时候编译器会报错。)元组可以作为参数和返回值。
var reversedNames = names.sorted(by: {(s1:String, s2:String) -> Bool in return s1 > s2})

根据上下文推断类型

因为排序闭包函数时作为sorted(by:)方法的参数传入的,swift可以推断其参数和返回值类型。
var reversedNames = names.sorted(by: {s1,s2 in return s1 > s2})
实际上,通过内联闭包表达式构造的闭包作为参数传递给函数或方法时,总是能够推断出闭包的参数和返回值类型。这就意味着闭包作为函数或者方法的参数时,几乎不需要利用完整格式构造内联闭包。

单表达式闭包隐式返回

单行表达式闭包可以通过省略return关键字隐式返回单行表达式的结果,如上版本的例子可以改写为:
var reversedNames = names.sorted(by: {s1,s2 in  s1 > s2})

参数名称缩写

swift自动为内联闭包提供了参数名称缩写功能,可以直接通过$0,$1,$2来顺序调用闭包的参数,以此类推。

如果你在闭包表达式中使用参数名称缩写,可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。

var reversedNames = names.sorted(by: $0 > $1)

运算符方法

实际上还有一种更简短的方式来编写上面例子中的闭包表达式。swift的String类型定义了关于大于号的字符串实现,其作为一个函数接受两个String类型的参数并返回bool类型的值。而这正好与sorted(by:)方法的参数需要的函数类型想符合。因此,可以简单的传递一个大于号,swift可以自动推断出想使用大于号的字符串函数实现;
var reversedNames = names.sorted(by:>)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift 闭包