Swift3.0-closure的@autoclosure和@escaping

本文深入解析Swift中的autoclosure和@escaping两个特性。autoclosure能够自动将表达式封装为闭包,简化语法。@escaping则用于标记那些在外部保存并可能在函数返回后执行的闭包,适用于如网络请求等异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)autoclosure:

  autoclosure可以把一句话自动的封装成一个闭包。但是不支持带有输入参数的写法

    
    func autoclosure(_ check: @autoclosure ()->Bool) {
        
        if check() {
            
            print("true")
        }
    }

  此时调用的时候就可以直接写成:

autoclosure(2>3)

 

(二)@escaping:

  在以前版本闭包的使用时不用加@escaping的。当前版本,如果闭包没有回调参数返回值,是不需要@escaping的。但是如果闭包传递了参数。就会出现一种假设。那就是参数中block的内容会在函数执行返回前就完成。也就是说对于block的调用时同步的。

  简单的说 就是如果这个闭包是在这个函数结束前被调用,就是noescape。

  闭包在函数执行完成后才调用,调用的地方超过了函数的范围,就是逃逸闭包。

  网络请求后结束的回调就是逃逸的。因为发起请求后过一段时间闭包执行。

  在swift3.0中所有闭包都是默认非逃逸的,无需@noescape。如果是逃逸的就@escaping表示。

  延迟操作,网络加载等都需要@escaping。

 

  

    func clorse(completion:@escaping (_ json: [String])->()) {
        
        let workingQueue = DispatchQueue(label: "workingQueue")
        
        workingQueue.async {
            
            // 延迟操作
            print("努力工作")
            
            Thread.sleep(forTimeInterval: 2.0)
            
            let json = ["ac","mym"]
            
            DispatchQueue.main.async {
                
                print("结束工作")
                
                // 主线程更新 回调
                completion(json)
            }
            
            
        }
   
        
    }

 

转载于:https://www.cnblogs.com/sgxx/p/6209944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值