標籤:style 使用 strong os for re
Default Parameter Values (參數預設值)
在定義函數的時候,你可以給任何參數定義一個預設的值,如果定義了預設值,在調用這個函數的時候,你可以忽略這個參數.
注意:
設定參數預設值的時候,需要按照函數的參數列表最後的開始,這可以確保在調用函數的時候,即使沒預設值的參數也可以按順序的對應上,也使得函數在調用的時候更加清晰.
下面的代碼例子是join函數的新版本,它使用了預設參數:
func join(string s1: String, toString s2: String,
withJoiner joiner: String = " ") -> String {
return s1 + joiner + s2
}
如果在調用joiner函數的時候,設定了一個string的預設值,那麼這個值可以與另外一個字串拼接在一起:
join(string: "hello", toString: "world", withJoiner: "-")
// returns "hello-world”
但是如果調用joiner的時候沒有設定預設值,系統將會使用一個空格代替:
join(string: "hello", toString: "world")
// returns "hello world”
External Names for Parameters with Default Values (預設值的副檔名)
在多少情況下,對參數使用預設值的時候都需要提供副檔名.這樣可以明確參數的意義,尤其是在調用函數的時候.
為了方便,在你沒有提供副檔名的時候,Swift提供了自動副檔名給定義的預設參數.這個自動副檔名與局部參數名相同,就好像你寫了一個#號在局部變數的前面.
下面是join函數的的一個版本,它沒有提供參數的副檔名,但提供了預設值:
func join(s1: String, s2: String, joiner: String = " ") -> String {
return s1 + joiner + s2
}
在這種情況下,Swift自動的提供了一個擴充的參數名給有預設值的參數.因此在調用函數的時候,必須提供副檔名的參數,這使得函數的參數更加清楚和沒有歧義:
join("hello", "world", joiner: "-")
// returns "hello-world”
Variadic Parameters (可變參數)
一個可變參數可以接收某種類型的0個或者多個值.在調用函數的時候,你可以使用可變參數來指定傳遞給函數的參數個數.可變參數的寫法是在參數類型名的前面插入三個點字元 (...).
傳遞給可變參數的值可以在函數體內作為類似數組的類型使用.例如:
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
注意:
一個函數最多隻能有一個可變參數,並且必須在參數列表的最後面,這是為了避免在調用多個參數的函數的時候有歧義.
如果你定義函數的有一個或者多個參數有預設值,也可以使用可變參數,只是要將它放在所有預設參數的最後面.
Constant and Variable Parameters (參數常量和參數變數)
函數參數預設是常量,在函數內部試圖修改一個函數的參數值都會產生一個編譯錯誤.這就意味著你不能修改函數的參數.
然而,有時候一個參數值的可變拷貝對函數是非常有用的,這樣你可以避免在定義一個新的變了在函數體內部.參數變數可以像使用變數而不是常量的方式來處理,並給它複製一個參數 值的新拷貝.
定義參數變數是在參數名前面使用首碼的關鍵字:var
func alignRight(var string: String, count: Int, pad: Character) -> String {
let amountToPad = count - countElements(string)
for _ in 1...amountToPad {
string = pad + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello”
這個例子定義了一個叫做alignRight的新函數,它將輸入的字串進行靠右對齊,在這個例子裡,字串‘hello’被轉換為’-----hello’.
函數alignRight定義了參數變數string,這意味著string是可變的局部變數,可以使用傳遞的字串值進行初始化,也可以在函數體內進行修改使用.
這個函數一開始先計算出有多少個字元需要添加到string的左邊來達到靠右對齊的效果.這個值被儲存在局部常量amountToPad中,然後函數添加amountToPad個數量的虛線字元在 string的左邊,最後返回結果.
注意:
可修改的參數變數作用範圍不能超過函數的末尾,並且對於函數之外,它們是不可見的.參數變數的生命期只存在於函數的調用周期.
//******待續...*******//