• Swift3.0-closure的@autoclosure和@escaping


    (一)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)
                }
                
                
            }
       
            
        }
  • 相关阅读:
    机器学习常用算法
    判别式模型与生成式模型
    数据清洗方法
    机器学习项目流程清单
    免费的论文查重网站
    (转载)python应用svm算法过程
    opencv图像阈值设置的三种方法
    Tensorflow读取csv文件(转)
    tensorflow的数据输入
    为什么有些图像在显示前要除以255?(zhuan)
  • 原文地址:https://www.cnblogs.com/sgxx/p/6209944.html
Copyright © 2020-2023  润新知