swift之闭包的使用

编程入门 行业动态 更新时间:2024-10-24 14:16:23

<a href=https://www.elefans.com/category/jswz/34/1768364.html style=swift之闭包的使用"/>

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

 

更多推荐

swift之闭包的使用

本文发布于:2024-02-11 22:43:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1684018.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:swift

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!