映月读书网 > iOS编程基础:Swift、Xcode和Cocoa入门指南 > 2.12 定义与调用 >

2.12 定义与调用

Swift中非常常见的一种模式就是定义一个匿名函数然后调用它,如以下代码所示:


{
    // ... code goes here
}  

注意花括号后面的圆括号。花括号定义了一个匿名函数体;圆括号则调用了这个匿名函数。

为什么会这么做呢?如果想要运行一些代码,直接运行就行了;为什么还要将其嵌入更深的层次作为函数体,反过来再运行它呢?

首先,匿名函数是降低代码的命令性,增强函数性的一种行之有效的方式:动作在需要时才发生,而无须借助一系列的准备步骤。如下是个常见的Cocoa示例:创建并配置一个NSMutableParagraphStyle,然后在对addAttribute:value:range:的调用中使用(content是个NSMutableAttributedString)。


let para = NSMutableParagraphStyle
para.headIndent = 10
para.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章将会进一步介绍定义与调用的使用场景。