-闭包的使用
提问:block 的应用场景是什么?
1. `网络(异步的)代码添加到队列,队列调度完成` -> 回调
无法通过返回值通知调用方
2. 回调的数值,是通过 block 的 `参数进行传递的`
1. Swift 中一般不需要使用 self.,但是 闭包中必须要使用
为什么?
- 正常的代码,当前 `上下文` 隶属于同一个对象,直接访问属性,是没有问题的
- 闭包是提前准备好的代码,在执行的时候,需要告诉函数访问哪一个对象的属性
- 因此,在闭包中必须要使用 self.
2. 建议:平时不要写 self.,如果 Xcode 提示,会注意到闭包
3. 解包
! - 强行解包
? - 可选解包
* 如果有值,返回 `可选值`
* 如果没有值,给 nil 发送后续的消息 `setFrame` -> 什么都不做!
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.demoView?.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
}) { _ in
print("hehe")
}
}
// `尾`随闭包
// 1. 闭包是最后一个参数
// 2. 函数的 `) ` 可以前置到倒数第二个参数末尾
// 3. 后面的参数直接使用 { // 执行代码 }
// 4. 尾随闭包,不需要外部参数,用处,通常一个函数的末尾,如果添加了一个闭包参数,使用 尾随闭包就方便了!
// 闭包的补充:如果没有参数/没有返回值, `in` 前面的所有内容都可以省略
func tailDemo() {
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
print("hehe")
}
dispatch_async(dispatch_get_global_queue(0, 0), { () -> () in
print("xixi")
})
}
// 1. 参数 (text: String) -> (),接收 字符串,没有返回值的闭包
// 提前准备好的代码,需要的时候调用
func loadData(callback: (text: String)->()) {
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
let str = "html"
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// 通过回调通知调用方,把异步请求结束的结果,通过参数,传递给闭包
callback(text: str)
})
}
<pre name="code" class="objc">class ViewController: UIViewController {
var demoView: UIView?
override func viewDidLoad() {
super.viewDidLoad()
// 尾随闭包
// loadData { (text) -> () in
// print(text)
// }
// 函数方式调用
// loadData({ text -> () in
// print(text)
// })
loadData { text in
print(text)
}
// 动画演示
let v = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
v.backgroundColor = UIColor.redColor()
view.addSubview(v)
demoView = v
// tailDemo()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
// UIView.animateWithDuration(0.5) { () -> Void in
// self.demoView?.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
// }
// UIView.animateWithDuration(0.5, animations: { () -> Void in
// self.demoView?.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
// }) { (_) -> Void in
// print("hehe")
// }