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

18487146383

热门课程

如何正确理解Swift语言的函数式编程

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

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

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

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

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

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

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货