长沙IOS培训
达内长沙IOS培训中心

18487146383

热门课程

Swift函数式编程

  • 时间:2016-03-15
  • 发布:长沙ios培训
  • 来源:达内新闻

Swift相比原先的Objective-C最重要的优点之一,就是对函数式编程提供了更好的支持。Swift提供了更多的语法糖和一些新特性来增强函数式编程的能力,本文就在这方面进行一些讨论。

Swift概览

对编程语言有了一些经验的程序员,尤其是那些对多种不同类型的编程语言都有经验的开发者,在学习新的语言的时候更加得心应手。原因在于编程语言本身也是有各种范式的,把握住这些特点就可以比较容易的上手了。

在入手一门新的语言的时候,一般关注的内容有:

1、原生数据结构

2、运算符

3、分支控制

4、如果是面向对象的编程语言,其面向对象的实现是怎样的

5、如果是函数式编程语言,其面向函数式编程的实现是怎样的

通过这几个点,其实只要阅读Swift文档的第一章,你就可以对这个语言有一个大概的印象。比如对于数据结构,Swift和其他的编程语言大体一样,有Int, Float, Array, Dictionary等,运算符也基本与 C 语言一致等。本文主要集中于对Swift函数式编程方面的特点进行一些盘点,因此在这里假设大家对Swift的基本语法已经有所了解。

对于一种编程范式,要掌握它也要抓住一些要点。对于支持函数式编程的语言,其一般的特点可能包含以下几种:

1、支持递归

2、函数本身是语言First Class的组成要素,且支持高阶函数和闭包

3、函数调用尽可能没有副作用 (Side Effect) 的条件

接下来我们来逐个盘点这些内容。

递归

Swift 是支持递归的,事实上现在不支持递归的编程语言已经很难找到了。在 Swift 里写一个递归调用和其他编程语言并没有什么区别:

func fib(n: Int) -> Int {

if n <= 1 {

return 1

}

else {

return fib(n-1) + fib(n-2)

}

}

fib(6) // output 13

关于 Swift 的递归没有什么好说的。作为一个常识,我们知道递归是需要消耗栈空间的。 在函数式编程语言中,递归是一个非常常用的方法,然而使用不慎很容易导致栈溢出的问题。 如果将代码改写为非递归实现,又可能会导致代码的可读性变差,因此有一个技巧是使用“尾递归”, 然后让编译器来优化代码。

一个 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 支持嵌套函数,但是当我们将fibiter 作为一个高阶函数包含在fib函数之内的时候却发生了 EXC_BAD_ACCESS 报错, 并不清楚这是语言限制还是 Bug。

上一篇:iOS培训:iOS开发Swift编程有哪些优点?
下一篇:如何正确理解Swift语言的函数式编程

2017三季度iPhone 7畅销榜新鲜出炉

iPhone X/8GPS定位问题,在iOS 11.2修复

成都高新区突围:5年建成万亿级创新创业中心

2017下半牛诺基亚净亏损1.90亿欧

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货