函數(shù)

外部參數(shù)(External Parameter Names)

有時候,調(diào)用函數(shù)時,給每個參數(shù)命名是非常有用的,因為這些參數(shù)名可以指出各個實參的用途是什么。

如果你希望函數(shù)的使用者在調(diào)用函數(shù)時提供參數(shù)名字,那就需要給每個參數(shù)除了局部參數(shù)名外再定義一個外部參數(shù)名。外部參數(shù)名寫在局部參數(shù)名之前,用空格分隔。

<pre><code>func someFunction(externalParameterName localParameterName: Int) {
// function body goes here, and can use localParameterName
// to refer to the argument value for that parameter
}</pre></code>

注意: 如果你提供了外部參數(shù)名,那么函數(shù)在被調(diào)用時,必須使用外部參數(shù)名。

簡寫外部參數(shù)名(Shorthand External Parameter Names)

如果你需要提供外部參數(shù)名,但是局部參數(shù)名已經(jīng)定義好了,那么你不需要寫兩次參數(shù)名。相反,只寫一次參數(shù)名,并用井號(#)作為前綴就可以了。這告訴 Swift 使用這個參數(shù)名作為局部和外部參數(shù)名。

下面這個例子定義了一個叫 containsCharacter 的函數(shù),使用井號(#)的方式定義了外部參數(shù)名:
<pre><code>func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
for character in string {
if character == characterToFind {
return true
}
}
return false
}</pre></code>

這樣定義參數(shù)名,使得函數(shù)體更為可讀,清晰,同時也可以以一個不含糊的方式被調(diào)用:

<pre><code>
let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
// containsAVee equals true, because "aardvark" contains a "v”
</pre></code>

默認(rèn)參數(shù)值(Default Parameter Values)

你可以在函數(shù)體中為每個參數(shù)定義默認(rèn)值。當(dāng)默認(rèn)值被定義后,調(diào)用這個函數(shù)時可以忽略這個參數(shù)。

注意: 將帶有默認(rèn)值的參數(shù)放在函數(shù)參數(shù)列表的最后。這樣可以保證在函數(shù)調(diào)用時,非默認(rèn)參數(shù)的順序是一致的,同時使得相同的函數(shù)在不同情況下調(diào)用時顯得更為清晰。

join函數(shù),其中joiner有了默認(rèn)參數(shù)值:
<pre><code>
func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") -> String {
return s1 + joiner + s2
}</pre></code>

注意:當(dāng)你未給帶默認(rèn)值的參數(shù)提供外部參數(shù)名時,Swift 會自動提供外部名字。此時外部參數(shù)名與局部名字是一樣的,就像你已經(jīng)在局部參數(shù)名前寫了井號(#)一樣。

可變參數(shù)(Variadic Parameters)

一個可變參數(shù)(variadic parameter)可以接受一個或多個值。函數(shù)調(diào)用時,你可以用可變參數(shù)來傳入不確定數(shù)量的輸入?yún)?shù)。通過在變量類型名后面加入(...)的方式來定義可變參數(shù)。

傳入可變參數(shù)的值在函數(shù)體內(nèi)當(dāng)做這個類型的一個數(shù)組。例如,一個叫做 numbers 的 Double... 型可變參數(shù),在函數(shù)體內(nèi)可以當(dāng)做一個叫 numbers 的 Double[] 型的數(shù)組常量。

下面的這個函數(shù)用來計算一組任意長度數(shù)字的算術(shù)平均數(shù):
<pre><code>func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8, 19)
// returns 10.0, which is the arithmetic mean of these three numbers
</pre></code>

注意: 一個函數(shù)至多能有一個可變參數(shù),而且它必須是參數(shù)表中最后的一個。這樣做是為了避免函數(shù)調(diào)用時出現(xiàn)歧義。

如果函數(shù)有一個或多個帶默認(rèn)值的參數(shù),而且還有一個可變參數(shù),那么把可變參數(shù)放在參數(shù)表的最后。

變量參數(shù)(Variable Parameters)

函數(shù)參數(shù)默認(rèn)是常量。試圖在函數(shù)體中更改參數(shù)值將會導(dǎo)致編譯錯誤。這意味著你不能錯誤地更改參數(shù)值。

但是,有時候,如果函數(shù)中有傳入?yún)?shù)的變量值副本將是很有用的。你可以通過指定一個或多個參數(shù)為變量參數(shù),從而避免自己在函數(shù)中定義新的變量。變量參數(shù)不是常量,你可以在函數(shù)中把它當(dāng)做新的可修改副本來使用。

通過在參數(shù)名前加關(guān)鍵字 var 來定義變量參數(shù):
<pre><code>
func alignRight(var string: String, totalLength: Int, pad: Character) -> String {
let amountToPad = totalLength - count(string)
if amountToPad < 1 {
return string
}
let padString = String(pad)
for _ in 1...amountToPad {
string = padString + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"</pre></code>

注意: 對變量參數(shù)所進行的修改在函數(shù)調(diào)用結(jié)束后便消失了,并且對于函數(shù)體外是不可見的。變量參數(shù)僅僅存在于函數(shù)調(diào)用的生命周期中。

輸入輸出參數(shù)(In-Out Parameters)

變量參數(shù),正如上面所述,僅僅能在函數(shù)體內(nèi)被更改。如果你想要一個函數(shù)可以修改參數(shù)的值,并且想要在這些修改在函數(shù)調(diào)用結(jié)束后仍然存在,那么就應(yīng)該把這個參數(shù)定義為輸入輸出參數(shù)(In-Out Parameters)。

定義一個輸入輸出參數(shù)時,在參數(shù)定義前加 inout 關(guān)鍵字。一個輸入輸出參數(shù)有傳入函數(shù)的值,這個值被函數(shù)修改,然后被傳出函數(shù),替換原來的值。

你只能將變量作為輸入輸出參數(shù)。你不能傳入常量或者字面量(literal value),因為這些量是不能被修改的。當(dāng)傳入的參數(shù)作為輸入輸出參數(shù)時,需要在參數(shù)前加&符,表示這個值可以被函數(shù)修改。

注意: 輸入輸出參數(shù)不能有默認(rèn)值,而且可變參數(shù)不能用 inout 標(biāo)記。如果你用 inout 標(biāo)記一個參數(shù),這個參數(shù)不能被 var 或者 let 標(biāo)記。

下面是例子,swapTwoInts 函數(shù),有兩個分別叫做 a 和 b 的輸入輸出參數(shù):
<pre><code>
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}</pre></code>

這個 swapTwoInts 函數(shù)僅僅交換 a 與 b 的值。該函數(shù)先將 a 的值存到一個暫時常量 temporaryA 中,然后將 b 的值賦給 a,最后將 temporaryA 幅值給 b。

你可以用兩個 Int 型的變量來調(diào)用 swapTwoInts。需要注意的是,someInt 和 anotherInt 在傳入 swapTwoInts 函數(shù)前,都加了 & 的前綴:

<pre><code>
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
println("someInt is now (someInt), and anotherInt is now (anotherInt)")
// prints "someInt is now 107, and anotherInt is now 3”</pre></code>

從上面這個例子中,我們可以看到 someInt 和 anotherInt 的原始值在 swapTwoInts 函數(shù)中被修改,盡管它們的定義在函數(shù)體外。

注意: 輸入輸出參數(shù)和返回值是不一樣的。上面的 swapTwoInts 函數(shù)并沒有定義任何返回值,但仍然修改了 someInt 和 anotherInt 的值。輸入輸出參數(shù)是函數(shù)對函數(shù)體外產(chǎn)生影響的另一種方式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù)是用來完成特定任務(wù)的獨立的代碼塊。給一個函數(shù)起一個合適的名字,用來標(biāo)識函數(shù)做什么,并且當(dāng)函數(shù)需要執(zhí)行的時候,這...
    窮人家的孩紙閱讀 860評論 2 1
  • 函數(shù)是執(zhí)行特定任務(wù)的代碼自包含塊。給定一個函數(shù)名稱標(biāo)識, 當(dāng)執(zhí)行其任務(wù)時就可以用這個標(biāo)識來進行”調(diào)用”。 Swif...
    透支未來閱讀 301評論 0 1
  • [The Swift Programming Language 中文版]本頁包含內(nèi)容: 函數(shù)是用來完成特定任務(wù)的獨...
    風(fēng)林山火閱讀 565評論 0 0
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,703評論 0 1
  • 本章將會介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語句Switch 語句控制轉(zhuǎn)移語句 continu...
    寒橋閱讀 802評論 0 0

友情鏈接更多精彩內(nèi)容