Reference:
@H_502_0@原版:The Swift Programming Language中文版:Swift 3 编程语言 - 闭包 @H_502_0@这是我最不了解的部分了(目前是最,可能以后是之一了……)。闭包的概念和 C 最远,各种超越、各种跳出作用域…… @H_502_0@
闭包
@H_502_0@内嵌函数其实就是一种特殊的闭包。闭包可以捕获或者存储定义在上下文中的变量和常量。 @H_502_0@闭包的常见作用: @H_502_0@以Swift
的 sorted(by:)
方法来说明闭包:
@H_502_0@首先说明一下 sorted(by:)
方法的作用:接收两个与数组内容相同类型的实际参数的闭包,然后返回一个 Bool
值——这个值用来说明排序的第一个值是不是应该排在第二个值前面。
方法一:写一个普通函数传入
func backward (_ s1: String,_ s2: String) -> Bool { return s1 > s2 }
方法二:写一个闭包
{ (参数列表) -> (返回类型) in // 使用 in 分割参数和函数体 语句 }@H_502_0@可以这么写:
sortResult = names.sorted(by: {(s1: String,s2: String) -> Bool in return s1 > s2 })@H_502_0@
类型推断
@H_502_0@貌似这个 feature 是语法糖(存疑) @H_502_0@闭包有办法通过上下文推断出类型。比如上面的闭包可以改为:sortResult = names.sorted(by: {s1,s2 in return s1 > s2})
当然,也可以显式地写出来。 @H_502_0@单表达式的闭包可以省略 return 语句:
sortResult = names.sorted(by: {s1,s2 in s1 > s2})
@H_502_0@也可以用 $0,$1,$2
等引用参数:sortResult = names.sorted(by: {$0 > $1})
@H_502_0@
尾随闭包
@H_502_0@感谢@被套撕裂者,说明:尾随闭包这一功能指的是:如果函数最后一个参数为闭包,那么在编写的时候,可以省略最后一个参数,并在函数尾部将这个闭包接上。 @H_502_0@比如一个函数是这样的:func someFunc (time: Int,method: (who: Person )->Void) { ... }@H_502_0@使用了尾随闭包的调用方法可以这么写:
someFunc (10) { person in //code..... }