讀古今文學網 > 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章將會進一步介紹定義與調用的使用場景。