}
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)








