=============================闭包的通用形式===================
闭包 = { (行参) -> 返回值 in
// 代码实现
}
====================//调用闭包
func clousre() {
ac()//无参数无返回值
a()//无参数无返回值的闭包的简写
b(1)//有参数无返回值的闭包
let cs=c(1)//有有参数有返回值
print(cs)
}
*************
//无参数无返回值----最简单的闭包
let a={
print("3")
}
a()
//有参数无返回值-----省略了返回值的闭包
let a={
(x:Int) in
print(x)
}
a(4)
//2、定义一个最简单的闭包,() -> () 没有参数,没有返回值
let ac = {()->() in
print("无参数无返回值的")
}
let a={
print("无参数无返回值的闭包的简写")
}
//3、定义一个带参数的闭包
//通过“in”关键字,对闭包的定义和实现进行分割,没有参数没有返回值可以省略in
// { (形参列表) 返回值类型 ->() in 实现代码}
let b={(x:Int)->()in
print("有参数\(x)无返回值")
}
//4、定义一个带参数,有返回值的闭包
let c={(x:Int)->Intin
return x+10
}
//注:在OC中{}用来分隔作用域的,而在swift中,表示一个闭包
//5.尾随闭包:如果一个函数的最后一个参数是闭包,则函数的参数可以提前结束,最后一个参数直接使用{}包装闭包的代码
let per = LYBHomeVC()
//******1、正常调用对象的函数---闭包作为函数参数
per.loadData(callBack: { () -> () in
print("闭包作为函数参数")
})
//******2、尾随闭包的改进:函数的参数可以提前结束,后面直接跟上一个闭包包装代码
per.loadData() { () -> () in
print("闭包作为函数参数提前结束参数")
}
//*****3、尾随闭包简写
per.loadData {
print("闭包作为函数参数简写")
}
===============闭包的循环引用的解决方法
//如果记录了闭包属性,然后在闭包中又使用了self,则产生了循环引用
//解决闭包中的循环引用
//方法一:
//weak只能修饰var,不能修饰let,因为如果weak的指针在运行时会被修改,会自动设置为nil
weak var weakself =self
loadData {
//!:强制解包,必须有值,如果解包的值为nil,则崩溃
//?:可选解包,如果解包为nil,则不会执行后面的内容
print(weakself?.view ?? "")
}
//方法二:推荐
//[weak self]表示闭包中的self都是弱引用
loadData { [weak self] in
print(self?.view ?? "")
}
//方法三:类似OC中的unsafe、_unretained,常用
//[unowned self]表示闭包中的self为assign,如果self被释放,则指针地址不会被释放,容易导致出现野指针
loadData { [unowned self] in
print(self.view)
}