一、闭包的定义
闭包和OC中的block非常相似,OC中的block是匿名的函数
Swift中的闭包是一个特殊的函数。在swift中也算是一种特殊的数据类型,即闭包类型。
- 1、闭包的定义
//无参数、无返回值的闭包
let callback :() -> (Void) = { () -> (Void) in
print("这是一个完整的没有参数,没有返回值的闭. 包")
}
callback ()
//有参数、无返回值的闭包
let callback: (String) -> (Void) = { (str:String) -> (Void) in
print("这是一个完整的有参数,没有返回值的闭包")
}
callback ("11111")
//有参数、有返回值的闭包
let callback: (String) -> (String) = { (str:String) -> (String) in
print("这是一个完整的有参数,有返回值的闭包")
return "1111";
}
let str = callback("ssss")
print(str)
---------------------------------------------------------------------总结:
闭包的写法:
闭包类型的写法:(形参列表)->(返回值)
闭包值的写法:
{
(形参) -> 返回值类型 in
// 执行代码
}
---------------------------------------------------------------------
#pragma mark - 无参数无返回值闭包其他省略写法
let callback1 = { () in
print("没有参数,没有返回值的闭包")
}
callback1 ()
let callback2 = {
print("没有参数,没有返回值的闭包")
}
callback2 ()
- 2、尾随闭包
//2.1.闭包作为参数传递
func test(callback:() -> ()){
callback()
}
test(callback: {() -> () in
print(122)
})
func test1(testback:(Int) -> () ){
testback(22222)
}
test1(testback:{(a:Int) -> () in
print(a);
})
//2.2.尾随闭包
a、如果闭包是函数的最后一个参数,则可以将闭包写在()后面,这种写法就是尾随闭包。
//函数一个参数
test1(testback:) { (a:Int) -> () in
print(a);
}
//函数多个参数
func test1(c:Int ,testback:(Int) -> () ){
testback(3333)
}
test1(c:12){(a:Int) -> () in
print(a);
}
b、如果函数只有一个参数,并且这个参数是闭包,那么()可以不写
func test1(testback:() -> () ){
testback()
}
test1{() -> () in
print(12345678);
}
c、 网络请求工具类
import UIKit
class HttpTool: NSObject {
func requestData(finishedCallback:(String) -> ()) {
finishedCallback("response");
}
}
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// httptool.requestData(finishedCallback:{ (str:String) in
// print(str)
// })
// }
// httptool.requestData() { (str:String) in
// print(str)
// }
let httptool = HttpTool()
httptool.requestData { (str:String) in
print(str)
}
}
}
- 3、逃逸(escaping)
一个接受闭包作为参数的函数,逃逸闭包(可能)会在函数返回之后才被调用,也就是说闭包逃离了函数的作用域
import UIKit
class HttpTool: NSObject {//@escaping逃逸的
func requestData(finishedCallback:@escaping (String) -> ()) {
DispatchQueue.global().async {
finishedCallback("response");
}
}
}
网友评论