swift 4.2 官方文档学习笔记(七)- 闭包

Sellen Wei
Dec 14, 2018

--

老实说,closure这篇通篇看下来没有很懂,不太明白用闭包的必要性在哪里,就先把code粘贴在这里,总结一下,方便以后回看吧,感觉工作中这样的例子也不多,当然error handle/completion什么的例外,我只说这一章举的例子都不是特别的接地气。可能是为了解释而解释吧。闭包(英文 中文

关于捕获值,这个是一个新的概念,简单来说就是函数在生成时,会捕获函数体内不存在的某个值(比如runningTotal),并在接下来调用此函数的运算中,继续使用这个值的copy。这个在使用makeIncrement生成多个不同函数的时候非常方便,互相的值互不干扰。

closure are reference type

逃逸闭包!!!!

由于工作当中经常要使用async function,因此就需要completion handler在函数结束后来返回值,这其中有个顺序问题,一定是在async函数结束之后,带着数据的completion handler才会返回值。所以这样顺序的handler,在函数体中都要被加上@escape关键词,闭包需要逃逸,以便于稍后调用。

As an example, many functions that start an asynchronous operation take a closure argument as a completion handler. The function returns after it starts the operation, but the closure isn’t called until the operation is completed — the closure needs to escape, to be called later.

Autoclosure

Autoclosure是一个比较复杂的概念,看网上对于autoclosure应该在什么时候使用有很多的解释,官方文档也不是那么好理解,这里总结一下在什么时候可能会用到autoclosure:

1 .当执行closure的代价十分昂贵,希望只有在closure被call的时候才调用(大部分的closure是在function pass in的时候被执行的,如果不想再pass in的时候执行,就要加上@autoclosure)

写的有点乱,我试图想把使用@autoclosure和不使用autoclosure放在一起比较,这样就introduce了another place to use:

“不使用花括号,直接传入参数”,当使用时,代码可以更省,省掉{},就像这样:serve(customer: customersInLine.remove(at: 0))

为什么可以传递给类型为闭包的参数呢?因为加上了@autoclosure标记后,编译器会自动把传递的表达式加上{},从而转换为闭包。这里的自动就体现在此了。要求就是表达式的返回值和闭包的返回值类型一致即可。

所以这个就是自动闭包的意思!!!自动将你传入的数据包成closure,然后执行。OMG官方文档真的好委婉,这么简单的意思搞这么复杂!

终极使用:

三年后的总结:

今天再来说说我对闭包的看法,首先闭包的存在在production里面是非常少的,基本上的调用都是一些跟延时有关的操作,或者一些本身就自带闭包的官方使用方式(sort,map),偶尔看到同事自创了一个高大上的闭包,一般也会被别人怼,因为可读性真的非常不好,还不如老老实实写传统的code。

--

--