Swift2 0語言教程之閉包

2021-09-08 11:12:24 字數 2592 閱讀 9802

閉包是自包含的函式**塊,可以在**中被傳遞和使用。swift中的閉包與c和objective-c中的**塊(blocks)以及其他一些程式語言中的lambda函式比較相似。在本章中所講的函式其實就是特殊的閉包。本節主要講解關於閉包的基本使用。

閉包表示式是一種利用簡潔語法構建內聯(內聯類似與c語言中的巨集定義)閉包的方式。以下這個**是對兩個字串的比較。

執行結果如下:

在此**中,當呼叫函式compare()時,會將str1和str2傳遞到給函式在定義時的引數s1,s2中,然後進行比較。在此**中可以看到,在compare()函式中執行了一行**,就是判斷並返回,顯的此函式相當冗長。此時就可以使用閉包表示式使用**變得更好。首先,來看一下閉包表示式(閉包函式)的語法形式。

其中,引數可以是常量、變數和輸入-輸出引數,但沒有預設值。開發者也可以在引數列表的最後使用可變引數。而元組也可以作為引數和返回值。關鍵字in表示閉包的引數和返回值型別定義已經完成,閉包函式體即將開始。

1.無參形式的閉包表示式

無參形式的閉包表示式語法形式如下:

它定義的語法形式如下:

它呼叫的語法形式如下:

【示例7-27】以下將使用閉包表示式實現字串"aaaa"的輸出。**如下:

執行結果如下:

2.具有引數的閉包表示式

具有引數的閉包表示式有兩種形式一種是最常用的只有乙個引數的閉包表示式;一種是具有多個引數的閉包表示式。以下是對這兩種具有引數的閉包表示式的詳細講解。

(1具有乙個引數的閉包表示式

具有乙個引數的閉包表示式的語法形式如下:

它定義的語法形式如下:

它的呼叫形式如下:

【示例7-28】以下將使用閉包表示式輸出指定字串。**如下:

執行結果如下:

(2具有多個引數的閉包表示式

具有多個引數的閉包表示式的語法形式如下:

它定義的語法形式如下:

它的呼叫形式如下:

【示例7-29】使用閉包實現對兩個任意數的求和計算,**如下:

執行結果如下:

其實閉包表示式最長用在其他的函式中,並不是單獨的去使用它。

【示例7-30】以下**將閉包表示式作為函式的一部分,來實現在判斷在陣列中是否有大於500或者40的元素。**如下:

在此**中,當呼叫copare()函式時,會將引數array、40以及閉包表示式傳遞到函式定義的引數中,在copare()函式中,遍歷陣列中元素的時候,又會去呼叫閉包表示式。執行結果如下:

在使用閉包表示式時需要注意以下幾點(以下都是以示例7-30來說明的):

1.推斷型別

copare()函式的第三個引數是閉包表示式,它的型別為(num:int,value:int)->bool,由於swift可以推斷其引數和返回值的型別,所以->和圍繞在引數周圍的括號可以省略,如以下的**:

2.省略return

單行表示式閉包可以通過隱藏return關鍵字來隱式返回單行表示式的結果,可以將上面的例子進行修改:

3.簡寫引數名

swift為內聯函式提供了引數名縮寫功能,開發者可以通過$0、$1、$2來順序的呼叫閉包的引數。如果在閉包表示式中使用引數名稱縮寫,可以在閉包引數列表中省略對其的定義,並且對應引數名稱縮寫的型別會通過函式型別進行推斷。in關鍵字也同樣可以被省略,因為此時閉包表示式完全由閉包函式體構成,將上面的例子進行修改:

4.寫在一行

當閉包的函式體部分很短時可以將其寫在一行上面,如以下**:

5.運算子函式

在swift中string型別定義了關於大於號(>)的字串實現,其作為乙個函式接受兩個string型別的引數並返回bool型別的值。而這正好與以上**sort函式的第二個引數需要的函式型別相符合。 因此,可以簡單地傳遞乙個大於號,swift可以自動推斷出您想使用大於號的字串函式實現:

在swift 1.2中使用閉包表示式需要注意以下三點:

如果開發者需要將乙個很長的閉包表示式作為最後乙個引數傳遞給函式,可以使用trailing閉包,它可以增強函式的可讀性。trailing閉包的一般形式如下:

注意:trailing閉包是乙個寫在函式括號之後的閉包表示式,函式支援將其作為最後乙個引數呼叫。示例7-30中**也可以寫為trailing閉包,**如下:

trailing閉包一般使用在當閉包很長以至於不能在一行進行編寫的**中。如以下的例子就使用了trailing閉包,實現將數字改為英文的功能。**如下:

執行結果如下所示:

注意:在此**中使用到了函式map(),它的功能是返回乙個新的序列。其語法形式如下:

其中,如果閉包表示式適用於序列中的所有元素,就會返回乙個新的序列。但是在本示例中由於閉包中的內容比較多,就將它使用了trailing閉包的形式。

閉包可以在其定義的上下文中捕獲常量或變數。以下就使用incrementor()函式從上下文種對值runningtotal和amount進行捕獲。**如下:

執行結果如下所示:

Swift2 0語言教程之類的方法

方法其實就是函式,只不過它被定義在了類中。在swift中,根據被使用的方式不同,方法分為了例項方法和型別方法兩種。這兩種方法的定義也和objective c是不同的。本節依次講解這兩種方法。例項方法被定義在類中,但是由類的例項呼叫。所以,這類方法被稱為例項方法。例項方法和函式一樣,分為了不帶引數和帶...

C語言教程之陣列詳解

目錄 陣列是一組相同型別元素的集合。陣列的建立方式 陣列的元素型別 陣列名 常量表示式 eg.int arr 5 char ch 100 vs編譯器中的易錯點 內應為常量表示式 int n 5 int arr n int arr 5 其實c99標準之前是不支援使用變數的,只能是常量!c99中增加了變...

Swift3 0語言教程組合字串

其中,astring用來指定乙個字串。import foundation var a nsstring string hello,print 組合前 a 組合字串 print 組合後 b 執行結果如下 組合前 hello,組合後 hello,world 2 padding tolength with...