//: Playground - noun: a place where people can play import UIKit //-----闭包-------// //是独立的代码块,可以代码中进行传递和使用 //swift中的闭包和OC中的block相似 //函数是一种特殊的闭包,是有名称的闭包 //1.基本使用 /* 闭包的语法: { (参数1,参数2) -> 返回值类型 in 闭包的代码 } */ func add(a:Int, b:Int) -> Int { return a + b } let closure = {(a:Int, b:Int) -> Int in return a + b } add(1, b: 2) closure(1, 2) //闭包的类型就是函数类型 let closure2 : (Int, Int)->Int = {(a:Int, b:Int) -> Int in return a + b } //闭包语法的简化,如果想省略闭包中参数和返回值的类型则需要显式的指定闭包变量的类型 let closure3 : (Int, Int)->Int = {a,b in return a + b } //单表达式引式返回:如果闭包的代码中只有一个表达式,则return可以省略 let closure4:(Int, Int)->Int = {a,b in a + b} closure4(10,5) //参数名也可以省略 let closure5:(Int, Int)->Int = {$0 + $1} closure5(1,2) //2.分别用函数和闭包实现数组中元素的遍历(对数组中每个元素执行某段代码) func emnumerateArray(array : [Int], function: (Int) -> Void) { for item in array { function(item) } } //每个元素将要执行的函数 func printItem(var item: Int) { item++ print(item) } let array = [1, 2, 3, 7] //emnumerateArray(array, function: printItem) let closure6 = { (item: Int) -> Void in print(item) } emnumerateArray(array, function: closure6) emnumerateArray(array, function: { (item: Int) -> Void in print(item) } ) //3.尾随闭包:如果闭包是最后一个参数,可以把闭包表达式写在函数参数()的后面,用来增加代码可读性 emnumerateArray(array) { (item : Int) -> Void in print(item) } //4.闭包捕获值 func makeIncrement(forIncrementor amount: Int) -> (Void)->Int { var total = 0 //嵌套函数可以捕获外部函数的变量或者常量 // func incrementor() -> Int { // // total += amount // print("total = (total)") // // return total // } // // return incrementor //闭包可以捕获外部定义的变量或者常量 let incrementor1 : (Void)->Int = { (Void)->Int in total += amount print("total = (total)") return total } return incrementor1 } let closure7 = makeIncrement(forIncrementor: 2) closure7() closure7() //闭包是引用类型 let closure8 = makeIncrement(forIncrementor: 3) closure8() closure8() let closure9 = closure8 closure9() var a = 0 //Int var b = a a = a + 1 print(b)