Swiftの可変長引数(Variadic Parameters)について

2016.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

今回はSwiftの可変長引数Variadic Parameters)について記載します。

可変長引数とはWikipediaで下記のように定義されています。 可変長引数(かへんちょうひきすう)とはプログラミング言語において、関数やメソッドやマクロの引数が固定ではなく任意の個数となっている引数のことである Wikipedia つまり、引数の個数を自由に設定出来るパラメーターになります。

Swiftでの実装

Swiftでは可変長引数を渡すには、ピリオド3つ ... を記述します。

可変長引数パラメータに渡された値は適切な型の配列として、関数内で利用できるようになります。
下記は可変長引数のサンプルになります。

func piyo(keywords: String...) -> Int {
    // keywordsは[String]として扱われる
    for keyword in keywords {
        print(keyword)
    }
    return keywords.count
}

// 引数の数は3
let count = piyo("apple", "orange", "melon") // apple orange melon がログ出力される
print(count) // 3

// 引数の数は1
let count2 = piyo("cat") // cat がログ出力される
print(count2) // 1

piyo("apple", "orange", "melon") では引数を3つ、 piyo("cat") では引数を1つセットしています。 このように呼出し元で引数の数を変えることが出来ます。
また、 func piyo(keywords: String...) 内ではkeywordsStringの配列 [String] として扱われます。
この関数を func piyo(keywords: Int...) のように書き換えた場合は、keywordsIntの配列 [Int] となります。

当たり前ですが、引数の型は合わせなくていけません。 例えば、

piyo("apple", 3, "melon") // Cannot convert value of type 'Int' to expected argument type 'String'

のようにStringとIntを混ぜるとビルドエラーになります。

標準APIの使用例

標準APIで可変長引数が使われている例として print() があります。

print("key1", "key2", "key3", separator: " + ", terminator: "***")
// key1 + key2 + key3***

printは下記の定義になっています。

public func print(items: Any..., separator: String = default, terminator: String = default)

参考

Variadic Parameters|The Swift Programming Language (Swift 2.2)