闭包。。曾经在javaScript中“大显身手,霸占内存”的传奇方法,现在在swift中又出现了,最简单的闭包就是函数内部的函数引用了该函数的局部变量或常量,有点点拗口,闭包的功能确实很强大,伟大的jQuery就是闭包的产物java
在js中的闭包正则表达式
function add(name){ var count = 0 ; function test(){ alert(name+"="+count); } return test; } //当外部函数执行完以后,会返回一个函数 var newFunc = add("小强"); newFunc();//打印输出 //当外部函数执行完后,局部变量并不会被gc回收,由于返回的函数引用了外部函数的变量,致使变量的引用计数不是0
在swift中,闭包形式也是这样的swift
func add(name: String) ->()->Int { var count = 0 func test() ->Int{ println("\(name)") return ++count } return test } //函数执行跟js中的调用同样同样地 //在全局函数中有个sort函数,就是以闭包的方法对数组进行排序的,返回一个新的有序数组 let names = ["A","E","F","C","B"] //sort函数须要传入两个参数,第一个参数为数组,第二个参数其实就是一个函数,但它在内部实现应该是引用了数组中的///属性 var newArray = sort(names,function) func sortFunction(s1: String, s2: String) -> Bool{ return s1 > s2 } var newArray = sort(names,sortFunction) //内联闭包表达式方法,能够简化以上操做//很是类似匿名函数 newArray = sort(names,{(s1: String,s2: String)->Bool in return s1>s2}) //闭包表达式方法{(参数) -> returnType in statements} //swift 的强大之处在于,能够根据本身的须要去推断函数的参数类型,返回类型,因此上的内联函数参数类型能够省略,///返回类型也能够省略 newArray = sort(names,{s1,s2 in return s1>s2}) //单表达式闭包隐式返回,单行表达式闭包能够经过隐藏return关键字来隐式返回单行表达式的结果,如上版本的例子能够改//写为: newArray = sort(names,{s1,s2 in s1>s2}) //我感受这么写对代码的可读性有点影响,最好仍是写上return //参数名缩写,swift为内联函数提供了这个方法,能够经过$0,$1,$3..顺序的去调用参数,(这个是借鉴的正则表达式的//方法么) //以上函数能够写成 newArray = sort(names,{$0>$1}) //文档中还有一个更简单的写法,swift 的string定义了 > 的字符串实现,接收两个string参数,返回boolean //swift会自动推断出你想用>的函数实现,更简洁写法 newArray = sort(names,>) //当看到尾随闭包时,感受好新鲜的,感受这种方式可能用的比较广,自我感受 func trailClosures(closure: () -> ()){ //函数接收一个返回函数的函数类型的函数 } //不使用尾随闭包,用内联函数去传参 trailClosures({()->() in return {() in 。。。}})//不知道这样写对不对,没机器测试啊,苦逼。。。。中.. //若是使用尾随闭包, trailClosures(){ } //当参数只是一个函数类型时,函数的()也能够省略 trailClosures{ } //数组有个map方法,来看一下用尾随闭包去写 var number = [1,2,3,4] number.map({ (a: Int) ->String in return String(a) })//内联闭包的写法 //尾随闭包的写法 var newArray = number.map{ (var num) -> String in var output = "" while num >0 { // output 处理 } return output } //****闭包是引用类型****//