Closure

//闭包 closures python中的lambda类似 nonamefunc lambda x,y:x > y

//swift中闭包的意思好像更广一些

//全局函数被看作是一个 有名字不可以捕获值(capture values)的闭包

//Nested function被看作是 有名字可以从父函数中捕获值的闭包

//Closure是一个没有名字,用来定义简单的函数,Closure可以捕获上下文{}之间的值


//其实Closure就是一个没有名字的函数而已,搞的很高大上的样子,

//相对pythonlambda,语法稍微复杂,这就意味着功能更强大一些。如下定义语法

//in前面是函数参数和返回值,in后面是闭包语句,

//*****参数可以是constvar,inoutvariadic 但是不可以是有默认值的

/*

    (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给出了类型,闭包中可以自动推导出paraInt

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还在++

你可能感兴趣的:(Closure)