close

Default Parameter Values

當我們定義function 的參數時,我們可以給他初始值:

func someFunc(parameterWithDefault: Int = 12) {

}

someFunc(6) // parameterWithDefault is 6

someFunc()  // parameterWithDefault is 12

 

針對初始值的部分我做了一些實驗,在多個參數及不固定設置初始值時的情況,以下為實驗結果:

當所有參數都有設定初始值時,可以呼叫myFunc();

當所有參數只有其中一個沒有初始值時,可以呼叫myFunc(myParameter);(*註2)

若所有參數有兩個以上沒有初始值時,設置參數就需先放置無初始值的,再放有初始值的,例如:

func myFunc(para1: Int, para2: Int, para3: Int = 3, para4: Int = 4)

此時可呼叫myFunc(1, para2:2)(*註1)

(註1: 第二個為什麼會有para2呢?還記得上一篇有提到,每個參數都有external parameter name 及 local parameter name,並且沒有特別設定的話,第一個參數是省略的,第二以後的參數會自動將local parameter name 當成external parameter name。因此以這題例子來看,至少需要代入的參數有para1及para2,第一個參數省略external parameter name,第二個參數的external parameter name等於local parameter name,也就是para2)

(註2:因此以註1的解釋來看,所有參數只有其中一個沒有初始值時,若剛好沒有初始值的是第一個參數,則可以呼叫myFunc(1);若是第二個以上,就看是哪個沒有初始值:假設是第三個沒有,則可以呼叫myFunc(para3:3),以此類推)

雖然在多個參數只有一個無初始值的情況下,無初始值的參數可以隨意放置,但是呼叫function時若需要一起更動有初始值的參數時就會難以控制。因此定義function參數的原則就是剛剛提到的:先放置無初始值的,再放有初始值的,呼叫function時就可清楚了解前幾個參數是無初始值的,一定要加入;後面可決定要加入哪個參數,比如:

myFunc(1, para2:2)  //裡面的參數分別為1, 2, 3, 4

myFunc(1, para2:2, para4: 5) //裡面的參數分別為1, 2, 3, 5

myFunc(1, para2:2, para3: 9, para4: 8) //裡面的參數分別為1, 2, 9, 8

 

Variadic Parameters

可變參數接受零個以上的值(相同的型態)傳入。寫法是參數宣告型態時後面加...

當數個值傳入可變參數時,他會轉換成陣列讓function使用。看看下面的例子:

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) //取輸入值的平均,輸出為3.0

arithmeticMean(3, 8.25, 18.75) //取輸入值的平均,輸出為10.0

 

同樣的道理,為了避免可變參數跟其他參數互相影響,可變參數最好放在最後面;若是同時存在有初始值的參數及可變參數時,可變參數放在最後一個

(實際上,若是可變參數放在第一個或是中間,是會出現compile-error的,而且也不能夠放兩個以上的可變參數)

arrow
arrow
    全站熱搜

    Eason 發表在 痞客邦 留言(0) 人氣()