Swift笔记:闭包
2016-04-15 15:24
267 查看
闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)相似。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。
闭包表达式(Closure Expressions)
闭包表达式是一种利用简洁语法构建内联闭包的方式。
Swift 标准库提供了名为sort的方法,会根据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。一旦排序完成,sort(:)方法会返回一个与原数组大小相同,包含同类型元素且元素已正确排序的新数组。原数组不会被sort(:)方法修改。
下面的闭包表达式示例使用sort(_:)方法对一个String类型的数组进行字母逆序排序.以下是初始数组值:
sort(_:)方法接受一个闭包,该闭包函数需要传入与数组元素类型相同的两个值,并返回一个布尔类型值来表明当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回true,反之返回false。
闭包表达式语法(Closure Expression Syntax)
一般形式:
闭包表达式语法可以使用常量、变量和inout类型作为参数,不能提供默认值。也可以在参数列表的最后使用可变参数。元组也可以作为参数和返回值。
因为排序闭包函数是作为sort(:)方法的参数传入的,Swift 可以推断其参数和返回值的类型。sort(:)方法被一个字符串数组调用,因此其参数必须是(String, String) -> Bool类型的函数。这意味着(String, String)和Bool类型并不需要作为闭包表达式定义的一部分。因为所有的类型都可以被正确推断,返回箭头(->)和围绕在参数周围的括号也可以被省略:
运算符函数(Operator Functions)
实际上还有一种更简短的方式来撰写上面例子中的闭包表达式。Swift 的String类型定义了关于大于号(>)的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。而这正好与sort(_:)方法的第二个参数需要的函数类型相符合。因此,可以简单地传递一个大于号,Swift 可以自动推断出您想使用大于号的字符串函数实现:
尾随闭包(Trailing Closures)
捕获值(Capturing Values)
闭包可以在其被定义的上下文中捕获常量或变量。即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
Swift 中,可以捕获值的闭包的最简单形式是嵌套函数,也就是定义在其他函数的函数体内的函数。嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。
闭包表达式(Closure Expressions)
闭包表达式是一种利用简洁语法构建内联闭包的方式。
Swift 标准库提供了名为sort的方法,会根据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。一旦排序完成,sort(:)方法会返回一个与原数组大小相同,包含同类型元素且元素已正确排序的新数组。原数组不会被sort(:)方法修改。
下面的闭包表达式示例使用sort(_:)方法对一个String类型的数组进行字母逆序排序.以下是初始数组值:
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] func backwards(s1:String,s2:String) -> Bool { return s1>s2 } var reversed = names.sort(backwards) print("\(reversed)") //["Ewa", "Daniella", "Chris", "Barry", "Alex"]
sort(_:)方法接受一个闭包,该闭包函数需要传入与数组元素类型相同的两个值,并返回一个布尔类型值来表明当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回true,反之返回false。
闭包表达式语法(Closure Expression Syntax)
一般形式:
{ (parameters) -> returnType in statements }
闭包表达式语法可以使用常量、变量和inout类型作为参数,不能提供默认值。也可以在参数列表的最后使用可变参数。元组也可以作为参数和返回值。
var reversed = names.sort({ (s1:String, s2:String) -> Bool in return s1 > s2 }) print("\(reversed)") //["Ewa", "Daniella", "Chris", "Barry", "Alex"]
因为排序闭包函数是作为sort(:)方法的参数传入的,Swift 可以推断其参数和返回值的类型。sort(:)方法被一个字符串数组调用,因此其参数必须是(String, String) -> Bool类型的函数。这意味着(String, String)和Bool类型并不需要作为闭包表达式定义的一部分。因为所有的类型都可以被正确推断,返回箭头(->)和围绕在参数周围的括号也可以被省略:
reversed = names.sort( { s1, s2 in return s1 > s2 } )
运算符函数(Operator Functions)
实际上还有一种更简短的方式来撰写上面例子中的闭包表达式。Swift 的String类型定义了关于大于号(>)的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。而这正好与sort(_:)方法的第二个参数需要的函数类型相符合。因此,可以简单地传递一个大于号,Swift 可以自动推断出您想使用大于号的字符串函数实现:
reversed = names.sort(>)
尾随闭包(Trailing Closures)
func someFunctionThatTakesAClosure(closure: () -> Void) { // 函数体部分 } // 以下是不使用尾随闭包进行函数调用 someFunctionThatTakesAClosure({ // 闭包主体部分 }) // 以下是使用尾随闭包进行函数调用 someFunctionThatTakesAClosure() { // 闭包主体部分 }
捕获值(Capturing Values)
闭包可以在其被定义的上下文中捕获常量或变量。即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
Swift 中,可以捕获值的闭包的最简单形式是嵌套函数,也就是定义在其他函数的函数体内的函数。嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor } //调用makeIncrementor let incrementByTen = makeIncrementor(forIncrement: 10) incrementByTen() // 返回的值为10 incrementByTen() // 返回的值为20 incrementByTen() // 返回的值为30
相关文章推荐
- 深入理解PHP之匿名函数
- Apple Swift学习教程
- 最后一次说说闭包
- 介绍 Fedora 上的 Swift
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Ruby中使用Block、Proc、lambda实现闭包
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- LUA中的闭包(closure)浅析
- Lua实现split函数
- Lua常用时间函数使用实例