swift之闭包的使用

时间:2021-12-24 22:45:24

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

闭包 = { (行参) -> 返回值 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)

}