swift第四日学习——闭包
- 闭包是在代码中可以传递和引用的功能性独立代码块,swift的闭包有以下三种形式
1.全局函数是一个有名字但不会捕获任何值的闭包
2.内嵌函数是一个有名字且能从其上层函数捕获值的闭包
3.闭包表达式是一个轻量级语法所写的可以捕获其上下文中常量或变量值的没有名字的闭包
闭包表达式语法
-
闭包表达式语法能使用常量形式参数、变量形式参数、输入输出形式参数,但不能提供默认值。可变形式参数也能使用,但需要在末尾使用。下面将通过sorted函数来学习一下闭包表达式
-
闭包表达式版本的sorted函数如下
let names = ["zhangsan","lisi","wangwu"]
var reverseNames = names.sorted(by : {(s1:String s2:String) -> Bool in
return s1 > s2
})
- 闭包可以从语句中推断语法,例如sort(by:)方法它期望的形参是一个(string ,string)-> Bool类型的函数,故(string ,string)-> Bool不需要写出来,因为所有的类型都能被推断
let names = ["zhangsan","lisi","wangwu"]
var reverseNames = names.sorted(by : {s1,s2 in
return s1 > s2
})
- 单表达式闭包可隐式返回,隐去return
let names = ["zhangsan","lisi","wangwu"]
var reverseNames = names.sorted(by : {s1,s2 in
s1 > s2
})
- swift会为闭包会自动提供简写参数名,故可以通过引用$0,$1来引用实参,省去参数名及in
let names = ["zhangsan","lisi","wangwu"]
var reverseNames = names.sorted(by : { $0 > $1 } )
- 运算符函数,swift的String类型定义了大于号的特定字符串实现,让其作为一个有两个string形参的函数并返回一个Bool值
故可以简写为:
let names = ["zhangsan","lisi","wangwu"]
var reverseNames = names.sorted(by : > )
* 尾随闭包:是一个被书写在函数形式参数的括号外(后面) 闭包表达式。
let names = ["zhangsan","lisi","wangwu"]
var reverseNames = names.sorted{ $0 > $1 }
闭包捕获值
- 一个闭包能够从上下文中捕获已被定义的常量和变量,即使定义这些常量和变量的原作用域已经不存在,闭包仍能够在其函数体内引用这些值。
- 闭包是引用类型,故如果你分配了一个闭包给类实例的属性,并且闭包通过引用该实例或者他的成员来捕获实例,你将在闭包和实例间产生循环引用
逃逸闭包
- 当一个闭包作为一个实际参数传递给一个函数,并在函数返回之后调用,就称这个闭包逃逸了。可在形参前写@escaping来明确闭包是允许逃逸的