课程咨询 :18487146383     QQ:570023382

长沙ios培训 > 达内新闻 > Swift函数式编程
  • Swift函数式编程

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

  • 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语言的函数式编程

最新开班日期  |  更多

3G-IOS软件工程师就业班

3G-IOS软件工程师就业班

开班日期:11/30

3G-IOS软件工程师就业班

3G-IOS软件工程师就业班

开班日期:11/30

3G-IOS软件工程师全日制班

3G-IOS软件工程师全日制班

开班日期:11/30

3G-IOS软件工程师周末班

3G-IOS软件工程师周末班

开班日期:11/30

  • 网址:http:/cs.ios.tedu.cn     地址:长沙市芙蓉中路一段479号建鸿达现代城27楼
  • 课程培训电话:18487146383     QQ:570023382     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56