Swift的函数式编程详解

2020-01-08 22:43:30丽君

类似于 Ruby,Swift 作为函数参数的闭包做了一点语法糖。 在 Ruby 中使用 Block 的时候,我们可以这样写:

 

复制代码
(1...5).map {|x| x*2} // => [2, 4, 6, 8]

 

在 Swift 当中我们可以得到几乎一样的表达式。

 

复制代码
var a = Array(1..5).map {x in x*2}
// a = [2, 4, 6, 8]

 

也就是说, 如果一个函数的最后一个参数是闭包,那么它在语法上可以放在函数调用的外面。 闭包还可以用$0、$1等分别来表示第 0、第 1 个参数等。 基本的运算符也可以看做函数。 下面的几种方式都可以实现逆序倒排的功能。

 

复制代码
let thingsToSort = Array(1..5)
var reversed1 = sort(thingsToSort) { a, b in a<b} var reversed2 =" sort(thingsToSort) { $0 < $1}" var reversed3 =" sort(thingsToSort, <) // operator as a function"  all the above are [5, 4, 3, 2, 1]<="" pre=""><p>总体来说,Swift 在添加方便函数操作、添加相关语法糖方面走的很远,基本上整合了目前各种语言中比较方便的特性。 实用性较好。</p><p><strong>Side Effects</strong></p><p>在计算机科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量 (函数外的变量) 或修改参数 (<a href="http://www.easck.com/wiki/Side_effect_%28computer_science%29" target="_blank">wiki</a>)。 函数副作用会给程序带来一些不必要的麻烦。</p><p>为了减少函数副作用,很多函数式编程语言都力求达到所谓的“纯函数”。 纯函数是指函数与外界交换数据的唯一渠道是参数和返回值, 而不会受到函数的外部变量的干扰。 乍看起来这似乎跟闭包的概念相抵触,因为闭包本身的一个重要特点就是可以访问到函数定义时的上下文环境。</p><p>事实上,为了在这种情况下支持纯函数,一些编程语言如 Clojure 等提供的数据结构都是不可变 (或者说 Persist) 的。 因此其实也就没有我们传统意义上的所认为的“变量”的概念。比如说,在 Python 中,字符串str就是一类不可变的数据结构。 你不能在原来的字符串上进行修改,每次想要进行类似的操作,其实都是生成了一个新的str对象。 然而 Python 中的链表结构则是可变的。且看下面的代码,在 Python 中对a字符串进行修改并不会影响b, 但是同样的操作作用于链表就会产生不一样的结果:</p><pre class="brush:js;toolbar:false">a = "hello, "