闭包是功能性自包含模块,可以在代码中被传递和使用.
形式:
1.全局函数是一个有名字但不会捕获任何值得闭包
2.嵌套函数是一个有名字并可以捕获其封闭函数域内值得闭包
3.闭包表达式是一个利用轻量级语法所写的可以捕获其上下文的变量或常量没有名字没有值得闭包.
//声明一个闭包:这是一个无名函数,作为闭包变量的类型
var myClosure:() -> String
//最简单的闭包
let myBlock = {
print("hello")
}
myBlock()
//闭包的完整写法
let myBlock1 = {()->() in
print("World")
}
myBlock1()
//带参数的闭包
let myBlock2 = {(x: Int, y: Int)->() in
print(x + y)
}
myBlock2(10, 20)
//带返回值的闭包
let myBlock3 = {(x: Int, y: Int)->(Int) in
return x + y
}
print(myBlock3(20, 30))
//闭包作为一个参数
func someFunctionThatTakesAClosure(closure: () -> ()) {
//函数部分
}
someFunctionThatTakesAClosure {
}
//捕获
var counter = 0
let incrementCounter = {
counter += 1
print(counter)
}
incrementCounter()
incrementCounter()
print(counter);
//闭包在上下文环境中捕获变量,常量 并在自己的作用域中使用
func countingClosure() -> () -> Int {
var counter = 0
let incrementCounter: () -> Int = {
counter += 1
return counter
}
return incrementCounter
}
let counter1 = countingClosure()
let counter2 = countingClosure()
//闭包的引用类型
/*
无论将闭包还是函数赋值给一个变量还是常量,实际上都是将常量或变量的值设置为对应函数/闭包的引用
*/
//排序
var names = ["casca", "zxmcn", "zdcv", "miibn"]
names = names.sorted()
print(names)
names.sort { (a, b) -> Bool in
a > b
}
print(names)
//遍历
//forEach
let values = [7, 4, 9, 10, 1]
values.forEach { (a) in
print(a)
}
//filter:按照规则过滤数组,筛选大于6的数
let res = values.filter { (a) -> Bool in
return a > 6
}
print(res)
//map 数组映射
let input = ["0", "12", "3"]
let number = input.map { (a) -> Int in
return Int(a)!
}
print(number)