Swift 闭包趣事谈



- 作者: SwiftCafe


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

作为变量

1
2
3
4
5
6
7
8
var double: (Int) -> Int
double = { num in
return num * 2
}
double(2) // 4

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

作为 Optionals

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

1
2
3
4
5
6
7
8
9
var optionalDouble: ((Int) -> Int)?
optionalDouble?(2) // nil
optionalDouble = { num in
return num * 2
}
optionalDouble?(2) // 4

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

作为 typealias

当然,我们还可以把闭包的定义声明称 typealias ,这样就可以在以后直接定义相同的类型:

1
2
typealias DoubleFunc = (Int) -> Int
var aliasDouble: DoubleFunc

定义为常量

1
2
3
4
5
let constDouble = { num in
num * 2
}
constDouble(2) //4

作为函数的参数

1
2
var array = [1,2,3,4]
array.sort({(item1: Int, item2: Int) -> Bool in return item1 < item2})

当然, 还可以简化一些,省去参数类型的声明, 让编译器隐式的找出类型:

1
array.sort({(item1, item2) -> Bool in return item1 < item2 })

同样, 我们还可以更加简略, 省去闭包的返回值类型声明:

1
array.sort({(item1, item2) in return item1 < item2 })

如果闭包是函数的最后一个参数, 那么两边的圆括号也是可以省略的:

1
array.sort{(item1, item2) in return item1 < item2 }

接着, 其实闭包参数名称也可以省略:

1
array.sort{return $0 < $1 }

因为闭包默认将最后一个语句作为返回值, 所以 return 关键字也是可以省略的:

1
array.sort{ $0 < $1 }

当然, 其实 sort 函数接受的不过是一个闭包, 比如我们这个用于两个数值比较, 我们不必一定要自己实现, 可以这样:

1
array.sort(<)

< 在 Swift 其实是一个函数, 用于比较两个数值的大小, 我们直接把它传进去完全符合语法。

结尾

闭包的表演到此结束, 一步一步深入后, 发现闭包的概念其实很灵活也很复杂。 国外有一个大神甚至把闭包的这些特性专门做了一个主页,很有意思, 大家也有兴趣的话也可以观摩一下: http://fuckingclosuresyntax.com

如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。




微信公众平台
更多精彩内容,请关注微信公众号


公众号:swift-cafe
邮件订阅
请输入您的邮箱,我们会把最新的内容推送给您: