Swift
的表达式理解不了?表达式是如何一步步变成你陌生的模样。下面为你一步步揭晓。
我要对我的 array
进行 map
操作。
let array = [1,2,3]
_ = array.map{ $0*3 }
上面的表达式清晰明了。就算你是刚学习 Swift
,也能明白就是针对 array
里面的每个元素乘以 3
。
但,作为一个优秀的程序员,如果停留在表象,那肯定不是你的梦想。
好了。下面为你揭晓它本来应该有的样子:
_ = array.map({( i:Int ) -> Int in
return i * 3
})
它其实就是个闭包。
如果将闭包作为参数传递,并且不再用这个闭包做其它事情,就没有必要现将它存储到一个局部变量中。
可以想象一下,比如 i*3
这样的数值表达式,可以把它直接传递给一个接受 Int
参数的函数,而不必先将它计算并存储到变量中。
如果编译器可以从上下文中推断出类型,就不需要指明它了。
在下面的例子中,从数组元素的类型可以推断出传递给map的函数接受 Int
作为参数,从闭包的乘法结果的类型可以推断出闭包返回的也是 Int
。
_ = array.map({i in
return i * 3
})
如果闭包表达式的主体部分只包括一个单一的表达式,则它将自动返回这个表达式的结果,可以不写 return
。
_ = array.map({i in
i * 3
})
Swift
会自动为函数的参数提供简写形式,$0
代表第一个参数,$1
代表第二个参数,以此类推。
_ = array.map({
$0 * 3
})
如果函数的最后一个参数是闭包表达式,那么可以将这个闭包表达式移到函数调用的圆括号的外部。
这样的尾随闭包语法在多行的闭包表达式中表现非常好,因为它看起来更接近于装配了一个普通的函数定义,或者是像 if(expr){}
这样的执行块的表达式。
_ = array.map(){
$0 * 3
}
最后,如果一个函数除了闭包表达式没有别的参数,那么方法名后面的调用时的圆括号也可以一并省略。
_ = array.map{
$0 * 3
}
这,就是你最终看到的样子。开心!
引用自《Swift 进阶》
本文由 Bill 创作。
最后编辑时间为: 2018.07.19 at 11:52 am