Functions And Closures(函数与闭包)
函数和闭包2个者联系较大就放在一起说了。
方法与go语言中很类型。大致讲下不同之处吧。
1:参数名与参数类型用:隔开
2:如果方法有返回值使用->来表示,多个返回值使用()括起来,与参数列表形式一致,例如 func test(name:String)->(n1:String,n2:String)
3:如果该的参数提供了外部参数名,你在调用该方法给这个参数传递值是需要通过外部参数名来传递.例如:func test(name a:String){} test(name:"shoper").当然也有种简写的办法,这样外部参数名就和参数名一致,func test(#name:String){} test(name:"shoper")
4:swift参数是值传递,如果需要在方法体类改变参数的值,需要使用inout修饰参数,传递参数时使用&取地址符
闭包是一种可以被传递和使用的独立的功能块,swift的闭包类似与C和OC的blocks,类似与其他语言的lambdas表达式.
简单介绍下闭包,通过Array的一个sort方法,我们来看一看这个闭包.
var reversed = sort([1,2,3,4],<span style="color:#ffcc33;">{(n1:Int,n2:Int)->Bool in return n1>n2}</span>)
我们来看看闭包表达式的语法
{ ( parameters ) -> return type in
statements
}
Swift的闭包表达式简洁,清楚的风格,优化与支持,简洁,无杂乱的语法.主要优化包括:
Inferring parameter and return value types from context •//根据上下文推断参数以及返回值类型
Implicit returns from single-expression closures •//单行表达式的闭包的隐式返回
Shorthand argument names •//简写参数名
Trailing closure syntax •//尾随闭包.
下面就介绍下这4个优点:
- Inferring arameter and return value types from context
例如: var reversed = sort([1,2,3,4],{(n1:Int,n2:Int)->Bool in return n1>n2})我们可以把这个闭包简写为:
var reversed = sort([1,2,3,4],{n1,n2 in return n1>n2}) 我们省去了参数的类型申明以及返回类型申明 - Implicit returns from single-expression closures
例如var reversed = sort([1,2,3,4],{n1,n2 in return n1>n2}) 我们可以把这个闭包表达式简写为
reversed = sort(names, { s1, s2 in s1 > s2 } ) - Shothand Argument Names
例如reversed = sort(names, { s1, s2 in s1 > s2 } )我们可以把这个闭包表达式简写为:
reversed = sort(names, { s1, s2 in s1 > s2 } )
更或者简写为:Operator Functions(运算符函数)
reversed = sort(names, >) - Trailing Closures
例如一个函数func someFunctionThatTakesAClosure(closure:()->()){}这个函数传递一个方法,我们可以调用函数时写成
someFunctionThatTakesAClosure(){}
Note:当然这样优化的前提是,该函数必须是方法的最后一个参数.