override func viewDidLoad() {
super.viewDidLoad()
// 1>. 最简单的闭包 ()->()没有参数,没有返回值的函数 如果没有参数,没有返回值,in可以省略
let b1 = {
print("Hello SiSi")
}
// 执行闭包
b1()
// 2. 带参数的闭包 参数,返回值,实现代码都是写在{}中
// {形参列表 - >返回值类型 // 实现代码}
// 使用 in 分割定义和实现 b2的类型: (Int) -> ()
let b2 = { (x: Int ) ->() in
print(x)
}
// 执行闭包
b2(100)
// 3.带参数/返回值的闭包
// (Int) -> Int
let b3 = {(y: Int) ->Int in
return y + 250
}
// 闭包调用
print(b3(30))
// 4.异步执行任务,获取数据,通过block/闭包回调,闭包的应用场景和闭包一样
// 5.尾随闭包 如果函数的最后一个参数是闭包,函数的参数可以提前结束,最后一个参数直接使用{}包装闭包的代码
/*
loadData() { (result) in
print(result)
}
*/
loadData { (result) in
print(result)
}
// 按照函数的本身编写
loadData(completion: {(result) -> () in
print(result)
})
}
func demo1() {
// 尾随闭包
DispatchQueue.global().async {
// 嵌套的GCD xcode不会改成尾随闭包
DispatchQueue.main.async(execute: {
})
}
// 尾随闭包
DispatchQueue.main.async {
}
}
func loadData(completion: (result: [String]) ->()) -> () {
// 将任务添加到队列,执行任务的操作,队列的调度是以同步/异步执行任务
DispatchQueue.global().async{
print("耗时操作\(Thread .current())")
// 休眠
Thread.sleep(forTimeInterval: 1.0)
// 获得数据
let json = ["头条","八卦","出大事了"]
//主线程更新
DispatchQueue.main.async(execute: {
print("主线程更新UI\(Thread.current())")
// 回调,执行,通过参数回调
completion(result: json)
})
}
}
// 1.使用变量记录函数
func demo() {
let x:Int = sum(x: 20, y: 30)
print("sum = \(x)")
// 闭包: 提前准备好代码,需要的时候执行,可以当做参数传递
// 定义一个常量记录函数 (x: Int, y: Int) -> Int
let f = sum
// 在需要的时候执行 在OC是不能实现
print(f(x: 30, y: 30))
}
func sum(x:Int,y: Int) -> Int {
return x + y
}
}
闭包
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 闭包介绍 Swift闭包和Objective-C中的Block很类似,是一段自包含的函数代码块,可以在代码中使用和...
- 本节知识点 闭包的基本概念 闭包基本使用 闭包表达式作为回调函数 闭包的多种写法(尾随闭包) 闭包表达式优化 闭包...
- 在试图弄清这个问题之前,先要理解栈内存、堆内存和预处理。 占用内存,不会销毁的闭包实例 例1: 例1的图示 未被占...