Tags: Swift 学习笔记
发布时间:2015-07-13
修改时间:2015-07-13
作者:Erwin
博客地址:技术杂货铺
欢迎转载,转载请注明出处。
Swift学习笔记系列——(6)闭包
闭包
什么是闭包
可以当作参数传递使用的代码块。
闭包的三种形态
闭包表达式
没有名字捕获上下文数据
简化闭包表达式的途径
- 根据上下文推测参数和返回值的类型,省去类型
- 单一返回值,省去return关键字
- 参数的简写,省去参数定义
- traling闭包语法,写在圆括号之外
闭包的一种实现:函数
func backwards(s1: String,s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sort(backwards)
闭包表达式语法
{ (parameters) -> return type in
statements }
参数可以用常量和变量的,也可以用inout参数,但是不能有默认值。使用可变参数的条件是给其命名,而且在参数列表最后。
in关键字分割闭包的参数返回类型和闭包体
闭包表达式完整写法
reversed = names.sort({ (s1: String,s2: String) -> Bool in return s1 > s2 })
写在一行的样子
reversed = names.sort( { (s1: String,s2: String) -> Boolinreturns1 > s2 } )
省去类型声明后
类型根据上下文推测
reversed = names.sort( { s1,s2inreturns1 > s2 } )
单一返回值,省掉return关键字
reversed = names.sort( { s1,s2ins1 > s2 } )
简化参数名字后
reversed = names.sort( {
使用
用操作符函数后
reversed = names.sort(>)
Trailling 闭包
如果你想要传递一个闭包表达式给函数的最后一个参数,同时这个闭包又非常长,这时你可以写一个Trailing 闭包作为替代。一个Trailing 闭包是被写在函数圆括号之外(或之后)的闭包表达式
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
// here's how you call this function without using a trailing closure: someFunctionThatTakesAClosure({ // closure's body goes here }) // here's how you call this function with a trailing closure instead: someFunctionThatTakesAClosure() { // trailing closure's body goes here }
如果一个闭包表达式作为一个函数的唯一参数同时这个闭包表达式又是一个Trailing 闭包,这种情况下调用函数时你不需要在函数名字后写一对圆括号了。
reversed = names.sort() {
如果只有一个trailing参数,圆括号可以省了
let strings = numbers.map {
(var number) -> String in
var output = “”
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
捕获值
捕获的内容有引用也有值副本,不由程序员控制,Swift会做好。
闭包作为类属性而且闭包捕获了实例(无论是引用了实例还是实力的属性),会形成闭包和实力之间的强引用环。破除这种强引用环,需要用到捕获列表。
闭包是引用类型的
本章思维导图