//闭包 closures 同python中的lambda类似 nonamefunc = lambda x,y:x > y
//在swift中闭包的意思好像更广一些
//全局函数被看作是一个 有名字不可以捕获值(capture values)的闭包
//Nested function被看作是 有名字可以从父函数中捕获值的闭包
//Closure是一个没有名字,用来定义简单的函数,Closure可以捕获上下文{}之间的值
//其实Closure就是一个没有名字的函数而已,搞的很高大上的样子,
//相对python的lambda,语法稍微复杂,这就意味着功能更强大一些。如下定义语法
//in前面是函数参数和返回值,in后面是闭包语句,
//*****参数可以是const,var,inout,variadic 但是不可以是有默认值的
/*
{
(parameters) -> return type in
statements
}
*/
//如下例子,定义了一个Closure(没有名字的函数),将其赋值给closurefunc
var closurefunc =
{
(para:Int)->Bool in
if para > 0
{
return true
}
else
{
return false
}
}
//closurefunc 自动推导为(Int)->Bool函数类型
println(closurefunc(3))
//可以进行反方向推导,如果给closurefunc一个类型,那么闭包中的类型就可以被推导出来。
//为描述重点突出,先把函数修改为如下
/*
var closurefunc =
{
(para:Int)->Bool in
return para > 0
}
*/
//简化1.由于closurefunc2给出了类型,闭包中可以自动推导出para为Int
var closurefunc1:(Int)->Bool =
{
(para)->Bool in
return para > 0
}
println("简化1:\(closurefunc1(3))")
//简化2.由于closurefunc给出了类型,意味着闭包类型为待赋值的函数类型,
//para的类型,以及函数类型中的返回值可以简化
var closurefunc2:(Int)->Bool =
{
para in
return para > 0
}
println("简化2:\(closurefunc2(3))")
//简化3.由于只有一条语句,而且closurefunc是有返回值的,
//闭包中的这条语句被推导为return,那么in后面的return也可以简化,多条语句显然不可以
var closurefunc3:(Int)->Bool =
{
para in para > 0
}
println("简化3:\(closurefunc3(3))")
//简化4.上面的闭包只有一句话 para in para > 0根据闭包的语法,in前面为参数,后面为语句
//可以将closurefunc的类型去掉,
var closurefunc4 =
{
para in para > 0 //两个参数的情况 para1, para2 in para1 > para2
}
println("简化4:\(closurefunc4(3))")
//简化5.Shorthand 忽略参数,将参数按照顺序用$+序号表示
var closurefunc5 =
{
$0 > 0 //swift的这种简化对于简短函数来说还是极其方便的
}
println("简化5 \(closurefunc5(3))")
//inout使用例子,注意inout Int是一个独立的类型,同Int是不一样的。
var inoutclosurefunc =
{
(inout para:Int) in para++ //返回值可以省略,但是Inout不可以,省略的话参数就只能推导为Int
}
var inoutdata = 3
println(inoutclosurefunc(&inoutdata)) //注意,一条语句的闭包默认把这条语句当作返回值
println("inout example \(inoutdata)")
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
//尾随闭包 trailing closure
//如果想为某个函数最后一个参数写一个闭包参数,那么可以将该参数写在函数的外边。
sorted(names){$0 > $1}
//NestedFunction
func test()->()->()
{
var testvar = 4
func inner()
{
//闭包中访问outer函数的变量不仅仅是复制了值,而且包含了一份引用
//比如test函数中返回的是inner函数,当test函数结束的时候,inner函数还是可以继续
//使用testvar的值。
println("I can access local var of outer function \(testvar++)")
}
return inner
}
var newfunc = test()
newfunc() //test()函数已经结束了,testvar还在++
newfunc() //test()函数已经结束了,testvar还在++