swift之闭包的使用
=============================闭包的通用形式===================
闭包 = { (行参) -> 返回值 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)
}
=============闭包作为属性===========
属性:
var strBlock : ((_ str1 : String, _ str2 : String) -> Void)?
实现闭包:let vcOne = TestOne()// 实现闭包 处理回调vcOne.strBlock = {(str1 : String, str2 : String) -> Void inprint(str1 + str2)}调用:strBlock?("hello", "world")//有参数无返回值:var scrollClickBlock:(Int)->()={ (Int)in return }调用:let lunbo:LYBHomelunboview=LYBHomelunboview.init(frame: CGRect(x: 0, y: 0, width:Int(WIDTH) , height:LUNBOHEIGHT))lunbo.scrollClickBlock={[weak self]//解决循环引用(index) in//传过来的tag,是从2开始switch index {case 0:breakcase 1: breakcase 2:print("\(index)")breakcase 3:breakdefault: break}return }//有参数有返回值var loginBlock:(NSInteger)->(NSInteger)?={ (NSInteger)in return 0}调用: let mineTabHeaderview:LYBMyHeaderview=LYBMyHeaderview.init(frame:CGRect.init(x: 0, y: 0, width: WIDTH, height: 200))
// weak var weakSelf = self//解决循环引用mineTabHeaderview.loginBlock={[weak self]//解决循环引用(index) inswitch index {case 0:let loginvc: LYBLoginVC=LYBLoginVC()self?.present(loginvc, animated: true, completion: nil)default: break}return 0}
========闭包作为函数参数====
func handler(_ a: Int, _ b: Int,operation:(Int,Int)->Int) ->Int {let res = operation(a,b)return res
}let multipyClosure = { //实现一个闭包(a:Int,b:Int) ina * b
}handler(2, 3, operation: multipyClosure) //将闭包作为参数传递
*************闭包的不同应用场景:
.html
.html
闭包作为参数
函数和闭包作为函数参数的区别:.html
发布评论