可変長引数に渡す引数が0個のときのをやり方と挙動をSwift 3.0.2で検証。
外部引数名がないもの
単に引数を省くだけである。
func testValArg(_ a: Int...) {
}
testValArg() //省くだけ
外部引数名があるもの
これも外部引数名ごと省くだけである。外部引数名をつけてはだめ。
func testValArg(a: Int...) {
}
testValArg() //まるごと省くだけ
可変長引数以外が同名の関数が他に定義されているとき
外部引数ごと省くとなると同名関数とバッティングする。例えばこの場合どうなるか。
func testValArg() {
print("なし")
}
func testValArg(a: Int...) {
print("あり")
}
testValArg() //なしと表示
これはコンパイルエラーにはならない。
呼ばれるのは引数なしの方になる。
この同名関数を削除すると当然可変長引数のものが呼ばれる。
func testValArg(a: Int...) {
print("あり")
}
testValArg() //ありと表示
ちなみに
外部引数名をつけたときはエラーになるが、そのエラーメッセージは定義されている引数の個数によって異なる。
1つのとき
func testValArg(a: Int...) {
}
testValArg(a:) //Expression resolves to an unused function
2つのとき
func testValArg(a: Int, b: Int...) {
}
testValArg(a: 1, b:) //Expected expression in list of expressions
引数が2つのときは引数が与えられていない状態と解釈出来ているが、1つのときは(実行指令ではなく)単に関数が書かれている状態という解釈と思われる。例えば
let atodeyaru: (Int...) -> Void = testValArg(a: )
のような使い方をするときの解釈である。