什么是自动闭包、逃逸闭包、非逃逸闭包?

非逃逸闭包, 永远不会离开一个函数的局部作用域的闭包就是非逃逸闭包。

func player(complete:(Bool)->()){ 
    complete(true) //执行闭包 传入真
}
 self.player { bool in
            print( bool ? "yes":"no")
        } // yes

当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。在形式参数前写@escaping来明确闭包是允许逃逸的。

 var completionHanglers: [() -> Void] = []
        
        func someFunctionWithEscapingClosure(completionHangler: @escaping () -> Void) {
            
        completionHanglers.append(completionHangler)
        }
completionHanglers.first?()

自动闭包:是一种自动创建的闭包,用来把作为实际参数传递给函数的表达式打包的闭包.他不接受任何实际参数,并且当它被调用时,它会返回内部打包的表达式的值.

Autoclosure 是用于延迟执行闭包的一种技术。使用 Autoclosure,我们可以将闭包作为参数传递给函数或方法,但是闭包不会立即执行。相反,它会在需要时才会被执行。



 

 public   func assert(_ condition:@autoclosure () -> Bool,_ message: @autoclosure () -> String = String(), file:StaticString = #file, line: Unit = #line)

let num = 3
  assert(num>3,"num不能大于3")

 

var customersInLine = ["李一", "张2", "刘3", "赵四", "王五"]
    
    override func viewDidLoad() {
        super.viewDidLoad()

        print(customersInLine.count)
        // 打印出“5”
        let customerProvider = { self.customersInLine.remove(at: 0) }//自动闭包
        print(customersInLine.count)//没有执行呢还    还是打印出“5”
        print("移除了 \(customerProvider())!") //移除了 李一!
        print(customersInLine)
        
        serve(customer: customersInLine.remove(at: 0))
        // 不用  @autoclosure 修饰
        serve2(customer: { customersInLine.remove(at: 0) } )
    }
    
    func serve(customer customerProvider: @autoclosure () -> String) {
       print("移除了 \(customerProvider())!")
        print(customersInLine)
    }
    
    func serve2(customer customerProvider: () -> String) {
       print("移除了 \(customerProvider())!")
        print(customersInLine)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值