IOS - 关于Swift中的闭包

前言:最近在自学swift,其中swift的闭包其实就是类似于oc中的block,只是两者还是有很多区别的,这里做一下总结,大牛勿喷。

一 什么是闭包

闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。

闭包采用如下三种形式之一:

1.全局函数是一个有名字,但是不捕获任何值的闭包

2.嵌套函数是一个有名字,会捕获其封闭函数域内值的闭包

3.闭包表达式是利用轻量级语法所写的可以捕获上下文中常量和变量值的匿名闭包

swift闭包的主要语法优化为以下几个形式:

1.利用上下文推断其参数和返回值的类型

2.隐式返回单行表达式的闭包,可以省略return

3.参数名缩写

4.尾随闭包语法

二 闭包表达式以及闭包的各种写法


以及几种语法优化形式:


尾随闭包:

简而言之就是,闭包作为最后一个参数写在函数的尾部增加可读性,并且在使用尾随闭包的时候不需要写出参数的标签。(个人觉得没啥好说的,可以自己写一个就知道了- -)

逃逸闭包:

闭包作为参数传入函数中,并是在函数返回之后才被执行,称为逃逸闭包,使用的时候在作为参数的闭包参数名前用@escaping 来标注

示例如下:


需要注意的是

将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self。比如说,在下面的代码中,传递到 someFunctionWithEscapingClosure(_:) 中的闭包是一个逃逸闭包,这意味着它需要显式地引用 self。相对的,传递到 someFunctionWithNonescapingClosure(_:) 中的闭包是一个非逃逸闭包,这意味着它可以隐式引用 self。

这里为什么一定要强调显示引用self来调用,说实话我还没弄明白,如果有大神,可以提示一下,非常感激...

自动闭包:

是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。这种便利语法让你能够省略闭包的花括号,用一个普通的表达式来代替显式的闭包。

我们经常会调用采用自动闭包的函数,但是很少去实现这样的函数。举个例子来说,assert(condition:message:file:line:) 函数接受自动闭包作为它的 condition 参数和 message 参数;它的 condition 参数仅会在 debug 模式下被求值,它的 message 参数仅当 condition 参数为 false 时被计算求值。

自动闭包让你能够延迟求值,因为直到你调用这个闭包,代码段才会被执行。延迟求值对于那些有副作用(Side Effect)和高计算成本的代码来说是很有益处的,因为它使得你能控制代码的执行时机。


虽然customersInLine数组的第一个元素被移除了,但是在调用闭包之前,闭包内的表达式是不会执行的,也就是说,如果闭包没有被调用,第一个元素永远不会被移除,因此可以将此闭包作为参数传入函数,这样就可以控制调用的时机。

可以将该函数当作接受 String 类型参数(而非闭包)的函数来调用。customerProvider 参数将自动转化为一个闭包,因为该参数被标记了 @autoclosure 特性。

过度自动闭包的使用会降低代码的可读性,慎用

好了,有关闭包的总结就到这里。


参考文献:

swift-闭包

你可能感兴趣的:(IOS - 关于Swift中的闭包)