闭包。。曾经在javaScript中“大显身手,霸占内存”的传奇方法,如今在swift中又出现了,最简单的闭包就是函数内部的函数引用了该函数的局部变量或常量,有点点拗口,闭包的功能确实很强大,伟大的jQuery就是闭包的产物
在js中的闭包
function add(name){
var count = 0 ;
function test(){
alert(name+"="+count);
}
return test;
}
//当外部函数执行完之后,会返回一个函数
var newFunc = add("小强");
newFunc();//打印输出
//当外部函数执行完后,局部变量并不会被gc回收,因为返回的函数引用了外部函数的变量,导致变量的引用计数不是0
在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
}
//****闭包是引用类型****//