Swift的函数式编程详解

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

一个 Common Lisp 的尾递归的例子是

 

复制代码
(defun fib(n)
    (fib-iter 1 0 n))
(defun fib-iter(a b count)
    (if (= count 0)
        b
        (fib-iter (+ a b) a (- count 1))))

 

我们可以把我们上述的 Swift 代码也改写成相同形式

 

复制代码
func fibiter(a: Int, b: Int, count: Int) -> Int {
  if count==0 {
    return b
  }
  else {
    return fibiter(a + b, a, count-1)
  }
}
func fib(n: Int) -> Int {
  return fibiter(1, 1, n);
}

 

我们可以 Playground 里观察是否使用尾递归时的迭代结果变化。

Swift的函数式编程详解

值得注意的是,这里出现了一个 Swift 的问题。虽然 Swift 支持嵌套函数,但是当我们将fibiter 作为一个高阶函数包含在fib函数之内的时候却发生了 EXC_BAD_ACCESS 报错, 并不清楚这是语言限制还是 Bug。

Swift 的高阶函数和闭包

在 Objective-C 时代,使用 block 来实现高阶函数或者闭包已经是非常成熟的技术了。 Swift 相比 Objective-C 的提高在于为函数式编程添加了诸多语法上的方便。

首先是高阶函数的支持,可以在函数内定义函数,下面就是一个很简洁的例子。

 

复制代码
func greetingGenerator(object:String) -> (greeting:String) -> String {
  func sayGreeting(greeting:String) -> String {
    return greeting + ", " + object