func printIntNum(add: (Int, Int) -> Int, a: Int, b: Int) {
println("num = \(add(a,b))")
}
之前已经学过函数类型做参数,在这里我们发现这个add是一个两个参数为Int类型,返回值为Int类型的函数类型。在函数内部实现调用add函数。
func add(a: Int, b: Int) -> Int {
return a + b
}
printIntNum(add, a: 10, b: 10)
调用时 ,add为函数类型参数传入,在调用函数是调用add()函数。
上一节中,使用了闭包,闭包的表达式是 {(参数) -> (返回值) in 实现 }。在函数调用时
var c = 1
self.printIntNum({ (a, b) -> Int in
c = 2
return a + b + c
}, a: 1, b: 1)
我们发现这也是一种闭包的表现形式,OC中的block。在运行时调用block
那这两个直接有神马不同呢?理解为函数类型做参数还是一种闭包呢?
这是一个事件的两种不同说法而已。函数类型作为函数参数,就是把函数作为参数(当做是普通类型的参数),这种函数是匿名函数(指一类无需定义标识符(函数名)的函数或子程序)
神马是闭包?
闭包是词法闭包(Lexical Closure)的简称。是在其词法上下文中引用了自由变量(自由变量是指局部变量以为的变量)的函数。自由变量和函数一同存在。
另一种说法:闭包是有函数和其相关的引用环境组合而成的实体
闭包也是匿名函数的一种,并且可以访问函数的外部变量。而函数类型做参数,这种函数的作用只是一般回调,用来调用已经处理好的代码块。
注:引用《The Swift Programming Language》
如发现有写的不对的地方,欢迎指正,共同进步。