函数的定义
- 无参数无返回值
func callFunc(){
print("func")
}
2.有参数无返回值
func callFunc(paramer: [String: String]){
print(paramer)
}
3.调用函数
callAdd()
callFunc(paramer: ["name" : "二先生"])
【注意】函数是特殊的闭包
闭包的定义
//定义一个闭包
let callAdd: (Int,Int)->(Int) = { a,b in
return a + b
}
let closeur = {(x: Int)->(Int) in
return x
}
print(closeur(19))
在swift 中的闭包和oc中的block 不仅定义差不多连使用场景也一样 : 1. 定义一个{}包装的代码块。2. 等到需要的时候在调用。 3 . 可以做为函数的参数传递
使用场景: 1. 异步请求数据的回调。2. 视图控制器的回调 3. 自定义视图的回调
第一种最常用的用法:数据回调
//定义全局函数记录closure
var closureCompletion: (()->())?
//closure
//@escaping 如果闭包在函数执行完后才被调用,称为逃逸闭包。典型的列子就是网络请求结束后,回调请求的数据
//@noescape 非逃逸闭包。snapkit 添加约束的方法就是非逃逸闭包
func loadData(completion: @escaping ()->()) -> () {
closureCompletion = completion
DispatchQueue.global().async {
sleep(3)//耗时
DispatchQueue.main.async(execute: {
//回调
completion()
})
}
}
【这样就形成了你中有我,我中有你就需要破环,避免循环引用占用内存】
方法1: weak var weakSelf = self //破除循环
//回调
loadData {
weakSelf?.view.backgroundColor = UIColor.red //closure 对 self的引用
// ? 和 ! 的区别
// ?可选解包 如果取出来的对象为nil,就不会去调用get method
// !强制解包 ,强制解包会调用对象的get method。一般用于取出可选对象的值来参与运算
}
方法2 : loadData {[weak self] in
self?.view.backgroundColor = UIColor.red //closure 对 self的引
}
}
前2天在改问题的时候,犯了一个错误:tableView的footerView添加了一个二维码设置居中的时候,始终是错开的。刚开始我还以为需要转换到同一坐标系的做法! 最后老铁提醒,原来是The superView is not same
把 imgeView.center = CGPointMake(footView.oa_width / 2.0,footView.oa_height / 2.0); 搞定