Swift中非常常见的一种模式就是定义一个匿名函数然后调用它,如以下代码所示:
{ // ... code goes here}
注意花括号后面的圆括号。花括号定义了一个匿名函数体;圆括号则调用了这个匿名函数。
为什么会这么做呢?如果想要运行一些代码,直接运行就行了;为什么还要将其嵌入更深的层次作为函数体,反过来再运行它呢?
首先,匿名函数是降低代码的命令性,增强函数性的一种行之有效的方式:动作在需要时才发生,而无须借助一系列的准备步骤。如下是个常见的Cocoa示例:创建并配置一个NSMutableParagraphStyle,然后在对addAttribute:value:range:的调用中使用(content是个NSMutableAttributedString)。
let para = NSMutableParagraphStylepara.headIndent = 10para.firstLineHeadIndent = 10// ... more configuration of para ...content.addAttribute( NSParagraphStyleAttributeName, value:para, range:NSMakeRange(0,1))
我觉得上面的代码丑陋至极。我们只在addAttribute:value:range调用中才需要将para作为value:实参传递进去,因此在调用中创建并配置它才是更好的做法。Swift允许我们这么做,我更倾向于下面这种写法:
content.addAttribute( NSParagraphStyleAttributeName, value: { let para = NSMutableParagraphStyle para.headIndent = 10 para.firstLineHeadIndent = 10 // ... more configuration of para ... return para }, range:NSMakeRange(0,1))
第3章将会进一步介绍定义与调用的使用场景。