闭包类似于oc中的block,用法基本类似!
oc中block为一种匿名的函数,而在swift中函数为特殊的闭包!
一、什么是闭包
1.提前准备好代码块
2.在需要的时候执行
3.可以当参数使用
二、闭包类型
//格式{形参列表 ->返回值类型 in//实现代码}
//1.无参数闭包,当没有参数是可以省去in
let clos = {
print("hello")
}
//执行闭包
print(clos);
//2.带参数闭包,
//闭包中,参数,返回值,实现代码都写在{}中
//格式{形参列表 -> 返回值类型 in//实现代码}
let clos2:(Int,Int) -> Int = {
(x: Int ,y: Int) -> Int in
return x + y
}
print(clos2(100,20));
//闭包可以根据上下文推断参数和返回值类型
let clos3:(Int, Int) -> Int = {
(a, b) in
return a + b
}
print(clos3(2,5))
三、尾随闭包
//闭包做为函数最后一个参数的时候,可以省略参数标签
func closFunction(block:() -> Void){
block();
}
func textFoxClos() {
//实际使用,这是xcode帮我们省略了标签
closFunction {
}
//实质是这样的
closFunction(block: {
})
//尾随闭包内再写一个尾随闭包xcode不会帮我们省去参数标签,但是可以手动删除参数标签
closFunction {
closFunction(block: {
})
}
}
四、逃逸闭包
//当一个闭包作为参数传到一个函数中,需要这个闭包在函数返回之后才被执行,我们就称该闭包从函数种逃逸。一般如果闭包在函数体内涉及到异步操作,但函数却是很快就会执行完毕并返回的,闭包必须要逃逸掉,以便异步操作的回调。
逃逸闭包一般用于异步函数的回调,比如网络请求成功的回调和失败的回调。语法:在函数的闭包行参前加关键字“@escaping”
func GCDText(completion: @escaping ([Any]) -> ()){
let json:[Any] = ["王万","老万",16]
DispatchQueue.global().async {
print("耗时操作\(Thread.current)")
//睡眠
Thread.sleep(forTimeInterval: 1.0)
//主队列回调
DispatchQueue.main.async(execute: {
print("主线程更新ui \(Thread.current)")
completion(json)
})
}
}
五、起别名
//起别名 类似oc中的typedef起别名
typealias AddBlock = (Int, Int) -> Int
let add:AddBlock = {
(a,b) in
return a + b;
}
print(add(2,4))