博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swift之闭包的使用
阅读量:4290 次
发布时间:2019-05-27

本文共 3283 字,大约阅读时间需要 10 分钟。

 

=============================闭包的通用形式===================

闭包 = { (行参) -> 返回值 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 in            print(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:break            case 1: break            case 2:                print("\(index)")                break            case 3:                                break            default: 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)  in                       switch 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) in    a * b}handler(2, 3, operation: multipyClosure) //将闭包作为参数传递

*************闭包的不同应用场景:

函数和闭包作为函数参数的区别:

 

转载地址:http://fimgi.baihongyu.com/

你可能感兴趣的文章
深入理解JSON对象
查看>>
类似新浪微博帖子显示话题、@好友、表情解析等
查看>>
JSP 自动刷新
查看>>
Java应用架构的演化之路
查看>>
看透内存中的数组
查看>>
Android工程打包成jar文件,并且将工程中引用的jar一起打入新的jar文件中
查看>>
JS单例模式在工作中的使用
查看>>
Java易混小知识——equals方法和==的区别
查看>>
内置对象(Session、Application、ViewState)
查看>>
为什么Java有GC还需要自己来关闭某些资源?
查看>>
Android 热修复,插件式开发---基本知识
查看>>
JSP九大内置对象、四种作用域、跳转方式
查看>>
JSP 自定义标签
查看>>
JSP JavaBean
查看>>
从两个字符串中找出最大公共子字符串
查看>>
Java代码添加背景音乐
查看>>
Java面试题全集(上)
查看>>
JAVA泛型中的有界类型(extends super)
查看>>
炫酷进度条:Android 仿应用宝下载进度条
查看>>
Java程序内存的简单分析
查看>>