闭包,老生常谈的一个东西。这次咱们再来唠叨唠叨, 看看能不能发现有用的信息。
var double: (Int) -> Int
double = { num in
return num * 2
}
double(2) // 4
这里声明 double 变量为 (Int) -> Int 类型,并且用闭包字面量给他赋值,然后调用它。 这时最常见的用法。
当然, Swift 有 Optionals 特性, 闭包还可以作为 Optionals:
var optionalDouble: ((Int) -> Int)?
optionalDouble?(2) // nil
optionalDouble = { num in
return num * 2
}
optionalDouble?(2) // 4
我们第一次调用 optionalDouble 的时候, 因为还没有给他初始值, 所以根据 Optionals 的特性会直接返回 nil。 接下来我们给他赋值, 然后再调用, 就可以返回相应的内容了。
当然,我们还可以把闭包的定义声明称 typealias ,这样就可以在以后直接定义相同的类型:
typealias DoubleFunc = (Int) -> Int
var aliasDouble: DoubleFunc
let constDouble = { num in
num * 2
}
constDouble(2) //4
var array = [1,2,3,4]
array.sort({(item1: Int, item2: Int) -> Bool in return item1 < item2})
当然, 还可以简化一些,省去参数类型的声明, 让编译器隐式的找出类型:
array.sort({(item1, item2) -> Bool in return item1 < item2 })
同样, 我们还可以更加简略, 省去闭包的返回值类型声明:
array.sort({(item1, item2) in return item1 < item2 })
如果闭包是函数的最后一个参数, 那么两边的圆括号也是可以省略的:
array.sort{(item1, item2) in return item1 < item2 }
接着, 其实闭包参数名称也可以省略:
array.sort{return $0 < $1 }
因为闭包默认将最后一个语句作为返回值, 所以 return 关键字也是可以省略的:
array.sort{ $0 < $1 }
当然, 其实 sort 函数接受的不过是一个闭包, 比如我们这个用于两个数值比较, 我们不必一定要自己实现, 可以这样:
array.sort(<)
< 在 Swift 其实是一个函数, 用于比较两个数值的大小, 我们直接把它传进去完全符合语法。
闭包的表演到此结束, 一步一步深入后, 发现闭包的概念其实很灵活也很复杂。 国外有一个大神甚至把闭包的这些特性专门做了一个主页,很有意思, 大家也有兴趣的话也可以观摩一下: http://fuckingclosuresyntax.com 。