Swift 函数式编程 - Block的千变万化
in 技术 with 0 comment

Swift 函数式编程 - Block的千变万化

in 技术 with 0 comment

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 进阶》

Responses