课程咨询 :18487146383     QQ:570023382

长沙ios培训 > 达内新闻 > 如何正确理解Swift语言的函数式编程
  • 如何正确理解Swift语言的函数式编程

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

  • Swift 的高阶函数和闭包

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

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

    func greetingGenerator(object:String) -> (greeting:String) -> String {

    func sayGreeting(greeting:String) -> String {

    return greeting + ", " + object

    }

    return sayGreeting

    }

    let sayToWorld = greetingGenerator("world")

    sayToWorld(greeting: "Hello") // "Hello, World"

    sayToWorld(greeting: " 你好 ") // " 你好, World"

    如果使用 block 实现上述功能,可读性就不会有这么好。而且 block 的语法本身也比较怪异, 之前没少被人吐槽。Swift 从这个角度来看比较方便。事实上,在 Swift 里可以将函数当做对象赋值, 这和很多函数式编程语言是一样的。

    作为一盘大杂烩,Swift 的函数系统也很有 JavaScript 的影子在里面。比如可以向下面这样定义函数:

    let add = {

    (a:Int, b:Int) -> Int in

    return a+b

    }

    add(1, 2) // 3

    等号之后被赋予变量add的是一个闭包表达式,因此更准确的说, 这是将一个闭包赋值给常量了。注意在闭包表达式中,in关键字之前是闭包的形式定义,之后是具体代码实现。 Swift 中的闭包跟匿名函数没有什么区别。 如果你将它赋值给对象,就跟 JavaScript 中相同的实践是一样的了。幸好 Swift 作为 C 系列的语言, 其分支语句 if 等本身是有作用域的,因此不会出现下列 JavaScript 的坑:

    if (someNum>0) {

    function a(){ alert("one") };

    }

    else {

    function a(){ alert("two") };

    }

    a() // will always alert "two" in most of browsers

    Swift 的闭包表达式和函数都可以作为函数的参数,从下面的代码我们可以看出闭包和函数的一致性:

    func function() {

    println("this is a function")

    }

    let closure = {

    () -> () in

    println("this is a closure")

    }

    func run(somethingCanRun:()-> ()) {

    somethingCanRun()

    }

    run(function)

    run(closure)

    类似于 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

    var reversed2 = sort(thingsToSort) { $0 < $1}

    var reversed3 = sort(thingsToSort, <) // operator as a function

    // all the above are [5, 4, 3, 2, 1]

    总体来说,Swift 在添加方便函数操作、添加相关语法糖方面走的很远,基本上整合了目前各种语言中比较方便的特性。 实用性较好。

    推荐文章

上一篇:Swift函数式编程

下一篇:Side Effects

最新开班日期  |  更多

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