博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift3.0-closure的@autoclosure和@escaping
阅读量:5113 次
发布时间:2019-06-13

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

(一)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

你可能感兴趣的文章
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
poj1201 查分约束系统
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>
安装 Express
查看>>
包含列的索引:SQL Server索引的阶梯级别5
查看>>
myeclipse插件安装
查看>>
浙江省第十二届省赛 Beauty of Array(思维题)
查看>>
NOIP2013 提高组 Day1
查看>>
个人对vue生命周期的理解
查看>>
cocos2dx 3.x simpleAudioEngine 长音效被众多短音效打断问题
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
Win磁盘MBR转换为GUID
查看>>
大家在做.NET B/S项目的时候多用什么设技术啊?
查看>>
Java SE和Java EE应用的性能调优
查看>>