天天看點

swift 函數.和匿名函數

函數

注意: 沒有定義傳回類型的函數會傳回特殊的值,叫 Void。它其實是一個空的元組(tuple),沒有任何元素,可以寫成()。

使用元組作為傳回參數,傳回多個參數

外部參數名..是為了調用該函數時讓其參數更為有表現力,更為通順,同時還保持了函數體是可讀的和有明确意圖的。讓别人閱讀整段代碼時更友善

當其他人在第一次讀你的代碼,函數參數的意圖顯得不明顯時,考慮使用外部參數名。如果函數參數名的意圖是很明顯的,那就不需要定義外部參數名了

如果你需要提供外部參數名,但是局部參數名已經定義好了,那麼你不需要寫兩次參數名。相反,隻寫一次參數名,并用井号(#)作為字首就可以了。這告訴 Swift 使用這個參數名作為局部和外部參數名。

将帶有預設值的參數放在函數參數清單的最後。這樣可以保證在函數調用時,非預設參數的順序是一緻的,同時使得相同的函數在不同情況下調用時顯得更為清晰。

當你未給帶預設值的參數提供外部參數名時,Swift 會自動提供外部名字。此時外部參數名與局部名字是一樣的,就像你已經在局部參數名前寫了井号(#)一樣。

一個可變參數(variadic parameter)可以接受一個或多個值.傳入可變參數的值在函數體内當做這個類型的一個數組。

一個函數至多能有一個可變參數,而且它必須是參數表中最後的一個。這樣做是為了避免函數調用時出現歧義。

如果函數有一個或多個帶預設值的參數,而且還有一個可變參數,那麼把可變參數放在參數表的最後。

函數參數預設是常量。試圖在函數體中更改參數值将會導緻編譯錯誤。這意味着你不能錯誤地更改參數值

注意: 對變量參數所進行的修改在函數調用結束後便消失了,并且對于函數體外是不可見的。變量參數僅僅存在于函數調用的生命周期中。

定義一個輸入輸出參數時,在參數定義前加 inout 關鍵字

輸入輸出參數不能有預設值,而且可變參數不能用 inout 标記。如果你用 inout 标記一個參數,這個參數不能被 var 或者 let 标記。

當傳入的參數作為輸入輸出參數時,需要在參數前加&符,表示這個值可以被函數修改

函數類型,可以讓一個變量可以成為多個函數,同時可以把函數當參數進行傳遞或者當做傳回值

閉包可以捕獲和存儲其所在上下文中任意常量和變量的引用。 這就是所謂的閉合并包裹着這些常量和變量,俗稱閉包。Swift 會為您管理在捕獲過程中涉及到的所有記憶體操作。

<dl></dl>

<dt>閉包采取如下三種形式之一:</dt>

<dd>全局函數是一個有名字但不會捕獲任何值的閉包</dd>

<dd>嵌套函數是一個有名字并可以捕獲其封閉函數域内值的閉包</dd>

<dd>閉包表達式是一個利用輕量級文法所寫的可以捕獲其上下文中變量或常量值的匿名閉包</dd>

閉包表達式:

閉包作為函數參數的話,由于類型推斷...可以省去閉包參數的類型和傳回值閉

包函數體内如果是單一表達式,還可以省去return語句

1 當使用參數名稱縮寫的時候可以省去in

2 運算符函數(Operator Functions)起作用還可以簡寫

如果您需要将一個很長的閉包表達式作為最後一個參數傳遞給函數,可以使用尾随閉包來增強函數的可讀性。 尾随閉包是一個書寫在函數括号之後的閉包表達式,函數支援将其作為最後一個參數調用。

閉包可以在其定義的上下文中捕獲常量或變量。

即使定義這些常量和變量的原域已經不存在,閉包仍然可以在閉包函數體内引用和修改這些值。

閉包是引用類型。但是注意,當一個嵌套函數内的函數作為傳回值的時候實際上是建立了一個新的函數.

注意: Swift 會決定捕獲引用還是拷貝值。 您不需要标注amount或者runningTotal來聲明在嵌入的incrementor函數中的使用方式。 Swift 同時也處理runingTotal變量的記憶體管理操作,如果不再被incrementor函數使用,則會被清除。