Edited at

Swiftで可変長引数に渡す引数が0個のときのやり方と挙動まとめ

More than 1 year has passed since last update.

可変長引数に渡す引数が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: )

のような使い方をするときの解釈である。