<1>闭包的声明(别名)
typealias myBlock : (text : String!) -> Void
<2>声明闭包属性
var block : myBlock!
<3>实现闭包 (在其他类中)
nextVC.block = {text in
self.label!.text = text //将值给label
}
<4>调用闭包(传值)
self.block(text : self.textField!.text!) //传textField中的文本
****swift 3.0********
//1.简单的闭包
// () -> () 没有参数,没有返回值的函数
//都没有,连in 可以一起省略
let b1 = {
print("hell")
}
//执行闭包
b1();
//2.带参数的闭包
//闭包中的参数,返回值,实现 的代码都卸载{} 中
//{(形参列表) -> (返回值类型) ...实现代码}
//需要使用关键字 in 用于分隔 定义 和实现
let b2 = {(x: Int) -> () in
print(x );
}
b2(121)
//3.带参数 带返回值的闭包
let b3 = {(x: Int) -> Int in
return x + 33;
}
print( b3(100) );
使用场景:
一.异步回调
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//尾随闭包
//如果函数的最后一个参数是闭包,函数可以提前结束,最后一个参数直接用{}包装闭包的代码
loadDAta { (result) in
print("获取的数据:(result)")
}
}
/**
异步执行任务,获取结果,通过block/闭包 回调
闭包的应用场景和block一样
*/
func loadDAta(completion:@escaping (_ result: [String]) ->() ) {
//GCD 将任务添加到队列中,指定执行任务的函数
DispatchQueue.global().async {
//耗时操作
print("耗时操作:(Thread.current))")
Thread.sleep(forTimeInterval: 1);
//获得结果
let json = ["头条","abc","哈哈"];
//执行闭包,传递异步获取的结果
completion(json);
DispatchQueue.main.async {
print("主线程更新UI(Thread.current)")
}
}
}
二,界面间反向传值
//1.第二个界面的属性
//定义个闭包类型(别名)
typealias Myclosure = (_ str: String) ->Void
class OneViewController: UIViewController {
//(1)定义闭包属性
var myClosure:Myclosure?
@IBAction func poppppppp(_ sender: Any) {
//(2)执行闭包
myClosure!("hello")
self.dismiss(animated: true) {
}
}
//2. 第一个界面 给闭包 赋值
@IBAction func click(_ sender: Any) {
let oneVC = OneViewController();
//(3)给闭包赋值,并获取回调内容
oneVC.myClosure = {(str) ->Void in
print("回到:(str)")
}
self.present(oneVC, animated: true, completion: nil)
}