swift函数闭包表达式之闭包简单使用

本文设计到嵌套函数的对比,请参考另外2篇文章《swift中嵌套函数与闭包的使用和区别》和 《swift嵌套函数的使用》

swift提供了简洁的闭包表达式来创建闭包,swift闭包表达式的标准语法如下:

{
    (形参列表)->返回值的类型 in 
    //零条到多条的可执行语句
}

闭包表达式与嵌套函数的语法非常相似,因此闭包表达式的形参列表的语法与嵌套函数的形参列表的语法几乎相同;闭包表达式返回值类型的语法与嵌套函数返回值类型语法也几乎相同。闭包表达式的语法与嵌套函数的语法主要区别就是:

  1. 定义闭包无需func关键字,无须指定函数名
  2. 定义闭包需要额外的 in 关键字
  3. 定义闭包的第一个花括号要移动到形参列表的圆括号之前。

swift的闭包表达式还可以做进一步的优化,从而使得程序更简洁。

调用闭包-使用闭包返回值:

//定义一个闭包,并为闭包表达式的形参定义外部形参名
//然后将闭包赋值给square变量
var square = {(value val : Int )->Int in
    return val*val
}
println( square( 10 ) ) //100
println( square( 9 ) ) //81

//使用闭包表达式定义闭包,并在闭包表达式后面增加圆括号来调用该闭包

var result = {
    (#base:Int, #exponent:Int) -> Int in 
    var result = 1;
    fot i in 1...exponent{
        result *= i
    }
    return result
}(4,3)
println( result ) //64


上面的程序中使用闭包表达式定义了两个闭包,其中第一个闭包被赋值给square变量,因此程序以后就可以通过该变量重复调用该闭包,如程序中println的两次输出。 程序第二个闭包并未赋值给任何变量,也没有将该闭包传给任何函数或方法,因此程序只能在定义该闭包的同时调用该闭包,正如上面程序锁看到的:程序在第二个闭包的后面使用圆括号执行调用,并传入了对应的参数,这样result 变量得到的不是闭包,而是执行第二个闭包的返回值。

从上面程序还可以看到一点,虽然闭包表达式支持为形参指定外部形参名,但这个外部形参名没有任何作用-程序调用闭包时依然不需要外部形参名,因此使用闭包表达式定义闭包时不要指定外部形参名。

注:使用闭包表达式定义闭包时虽然语法上允许指定额外的外包形参名字,但这些外部形参名没有任何作用,因此不要为形参指定外包形参名,这也许是swift设计不够周全的地方,也许未来的版本会改进