一、闭包
1.as!
:作用是类型转换
2.CustomStringConvertible
和CustomDebugStringConvertible
CustomStringConvertible 和CustomDebugStringConvertible这两个协议类似于Objective-C中的重写description方法,继承协议 实现description 和 debugDescription 属性 即可打印出想要的数据内容。
-
闭包作为函数参数传递时,可以省略返回值类型
,具体表现在代码写法上, 省略参数列表
和关键字in
//1.标准格式
BubbleSort(array: &stuArr, sortClosure:{(i, nextI) ->Bool in
return (i as! Student).achievement > (nextI as! Student).achievement
})
//2.省略返回值类型
BubbleSort(array: &stuArr, sortClosure:{(i, nextI) in
return (i as! Student).achievement > (nextI as! Student).achievement
})
//3.使用默认生成的参数名,(格式:$0,$1,$2...), 可以省略参数列表和闭包关键字in
BubbleSort(array: &stuArr, sortClosure:{
return ($0 as! Student).achievement > ($1 as! Student).achievement
})
推荐使用第3种高级写法
4.省略关键字return
如果闭包由一行代码组成,return关键字也可以省略,默认会将此行代码执行结果返回
BubbleSort(array: &stuArr, sortClosure:{
($0 as! Student).achievement > ($1 as! Student).achievement
})
5.后置闭包、逃逸闭包与自动闭包
- 后置闭包
1.当函数的最后一个参数为闭包参数时,在调用函数的时,可以将闭包结构脱离出函数的参数列表,追加在函数的尾部
, 增强代码的可读性.
//后置闭包结构
BubbleSort(array: &stuArr){
($0 as! Student).achievement > ($1 as! Student).achievement
}
//
2.函数只有一个参数且仅是闭包参数时,调用函数时,使用后置闭包写法,可以省略函数参数列表
,例如下面的代码:
//5.只有一个闭包参数的函数
func myFunc(closure:(Int,Int) -> Bool) {
}
//调用
myFunc{
$0 > $1
}
-
逃逸闭包
当闭包传递进函数时,系统会为此闭包进行内存分配
概念:
函数内的闭包在函数执行结束后在函数外依然可以使用 -
非逃逸闭包
概念:
当函数的生命周期结束后,闭包将会被销毁掉,不能继续使用.换句话说,非逃逸闭包只能在函数内部使用,在函数外部不能使用.
-
自动闭包
不是所有的闭包都需要显式
创建
严格条件:
-
此闭包不能有参数
-
在调用函数传参时, 闭包的实现只能由
一句表达式
组成
3.自动闭包参数由@autoclosure
来申明
//自动闭包
func myFunc2(closure:@autoclosure () -> Bool) {
}
//调用函数时,直接传入一个表达式,编译器会自动生成闭包参数
myFunc2( closure: 5 > 10)
//自动闭包默认为非逃逸闭包, 若要使用非逃逸类型的闭包参数,需要使用关键字@escaping
申明
func myFunc3(closure:@autoclosure @escaping () -> Bool) {
}
总结:
- 1.默认定义的闭包都是非逃逸闭包.
- 2.非逃逸闭包
不可以
作为返回值返回,如果这么做,编译器会抛异常 - 3.逃逸闭包常用于异步操作中, 例如
后台接口请求完成后
要执行闭包回调,需要使用逃逸类型闭包
- 4.
自动闭包默认为非逃逸闭包
, 若要使用非逃逸类型的闭包参数,需要使用关键字@escaping
申明
网友评论