语法
以下定义了一个接收参数并返回指定类型的闭包语法:
{(parameters) -> return type in
statements
}
简单的小例子:
let divide = {(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
print (result)
//以上程序执行输出结果为:10
一
let names = ["AT", "AE", "D", "S", "BE"]
// 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sorted(by: backwards)
print(reversed)
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]
sorted(by:)方法需要传入两个参数:
1.已知类型的数组。 || 例子中为names数组
2.闭包函数。 || func backwards(s1: String, s2: String)->Bool {return s1 > s2}
传入参数:2个,与数组元素类型相同 || 两个Sting类型
返回值:布尔类型值。 || s1>s2,大于true
True——排序结束后传入的第一个参数排在第二个参数前面
False——排在后面
二
参数名称缩写。可以直接通过
0,
1,$2来顺序调用闭包的参数。
若用参数名称缩写,可以在闭包参数列表中省略对其定义, swift会进行函数类型推断。in 关键字同样也可以被省略。
实例
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)
// $0和$1表示闭包中第一个和第二个String类型的参数。
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]
三
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted(by: >)
print(reversed)
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]
利用运算符函数,只传递一个运算符。
使用前提:sorted(by:)方法与(>)大于号运算符函数的传入参数和返回值类型相同。
Swift 的String类型定义了关于大于号 (>) 的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。 而这正好与sort(_:)方法的第二个参数需要的函数类型相符合。
四.尾随闭包
let names = ["AT", "AE", "D", "S", "BE"]
//尾随闭包
var reversed = names.sorted() { $0 > $1 }
print(reversed)
// sort() 后的 { $0 > $1} 为尾随闭包。
// 以上程序执行输出结果为:
// ["S", "D", "BE", "AT", "AE"]
如果函数只需要闭包表达式一个参数,使用尾随闭包时,甚至可以把()省略掉。即为:reversed = names.sorted { 0> 1 }
五.捕获值
闭包的形式有:
1.全局函数:有名字但不能捕获任何值。
2.嵌套函数:有名字,也能捕获封闭函数内的值。
3.闭包表达式:无名闭包,使用轻量级语法,可以根据上下文环境捕获值。
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int { // 闭包获取了runningTotal和amount的值
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
// 返回的值为10
print(incrementByTen())
// 返回的值为20
print(incrementByTen())
// 返回的值为30
print(incrementByTen())
//以上程序执行输出结果为:
//10
//20
//30