转载

Swift 闭包趣事谈

闭包,老生常谈的一个东西。这次咱们再来唠叨唠叨, 看看能不能发现有用的信息。

作为变量

var double: (Int) -> Int
double = { num in

return num * 2

}

double(2) // 4

这里声明 double 变量为 (Int) -> Int 类型,并且用闭包字面量给他赋值,然后调用它。 这时最常见的用法。

作为 Optionals

当然, Swift 有 Optionals 特性, 闭包还可以作为 Optionals:

var optionalDouble: ((Int) -> Int)?

optionalDouble?(2) // nil

optionalDouble = { num in
return num * 2
}

optionalDouble?(2) // 4

我们第一次调用 optionalDouble 的时候, 因为还没有给他初始值, 所以根据 Optionals 的特性会直接返回 nil。 接下来我们给他赋值, 然后再调用, 就可以返回相应的内容了。

作为 typealias

当然,我们还可以把闭包的定义声明称 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 。

原文  http://www.swiftcafe.io/2016/07/19/funny-closure/
正文到此结束
Loading...