#20 Swiftで学ぶ関数の応用(デフォルト引数・可変長引数)の基本
Swiftで関数を書けるようになると、次に気になるのが「毎回同じ値を渡すのが面倒」「引数の数が決まっていない関数を作りたい」といった悩みではないでしょうか。実はSwiftの関数には、こうした悩みを解決してくれる便利な仕組みが用意されています。それが「デフォルト引数」と「可変長引数」です。今回はこの2つの機能について、初心者の方にもわかりやすく解説していきます。
デフォルト引数とは
「デフォルト引数」とは、関数を呼び出すときに値を省略できる引数のことです。あらかじめ関数の定義側で「値が渡されなかった場合はこの値を使う」という初期値(デフォルト値)を決めておくことで、呼び出し側は必要なときだけ値を指定すればよくなります。
実際のコードを見てみましょう。
func greet(name: String, greeting: String = "こんにちは") {
print("\(greeting), \(name)さん")
}
greet(name: "田中") // こんにちは, 田中さん
greet(name: "佐藤", greeting: "おはよう") // おはよう, 佐藤さん
この例では、greetingという引数に"こんにちは"という初期値を設定しています。呼び出す側はgreetingを省略すればデフォルト値が使われますし、指定すればその値で上書きされます。
Swiftでは、デフォルト引数は基本的に引数リストの後ろのほうに置くのが読みやすいとされています。これは、呼び出し側で引数名を省略できる「先頭の引数」との組み合わせを考えたときに、順序がわかりやすくなるからです。ちなみに、PythonにもJavaScriptにも似た仕組みはありますが、Swiftは引数名(ラベル)を明示して呼び出すのが基本スタイルという点が特徴的です。慣れないうちは少し冗長に感じるかもしれませんが、コードを読んだときにどの値が何を意味しているか一目でわかるという利点があります。
可変長引数とは
次に「可変長引数」です。これは、関数を呼び出すときに渡す値の個数を自由に決められる引数のことです。「合計を計算したいけれど、足す数が2個の時も5個の時もある」といった場面で活躍します。
Swiftでは、引数の型のあとに...(ドット3つ)を付けることで可変長引数を宣言できます。
func sum(_ numbers: Int...) -> Int {
var total = 0
for number in numbers {
total += number
}
return total
}
print(sum(1, 2, 3)) // 6
print(sum(10, 20, 30, 40)) // 100
print(sum()) // 0
関数の内部では、可変長引数はひとまとまりの「配列」(複数の値を順番に並べて管理するデータの入れ物)として扱われます。上の例ではnumbersが[Int]型の配列になっており、for文で1つずつ取り出して合計を計算しています。呼び出す側は、カンマ区切りで好きな個数の値を渡すだけでよく、配列を自分で作って渡す必要がありません。
組み合わせるときの注意点
デフォルト引数と可変長引数は、同じ関数の中で一緒に使うこともできます。ただし、Swiftでは1つの関数につき可変長引数を使えるのは1か所だけというルールがあります。また、可変長引数の後ろに別の引数を続ける場合は、その引数に「引数名(ラベル)」を必ず付ける必要があります。これは、どこまでが可変長引数の値で、どこから次の引数が始まるのかをコンパイラ(コードを実行可能な形に変換するプログラム)が正しく判断できるようにするためです。
func makeMessage(_ words: String..., separator: String = " / ") -> String {
return words.joined(separator: separator)
}
print(makeMessage("Swift", "は", "楽しい"))
// Swift / は / 楽しい
この例では、可変長引数wordsのあとに、引数名付きのseparator(区切り文字を指定するデフォルト引数)を続けています。呼び出し順序や引数名のルールを守ることで、読みやすく安全なコードになります。
実務でどう役立つのか
デフォルト引数は、たとえば「ログを出力する関数」や「画面に何かを表示する関数」など、多くの場合は決まった設定を使いつつ、たまに細かい調整をしたいときに便利です。毎回すべての引数を書く必要がなくなるため、コードがすっきりします。
可変長引数は、合計や平均を求める関数、複数の文字列をつなげる関数など、「渡す値の数が状況によって変わる」処理でよく使われます。SwiftのAPI(あらかじめ用意された機能の呼び出し窓口)の中にも、print関数のように可変長引数を使っているものがあります。実は、普段何気なく使っている機能の裏側にも、この仕組みが活きているのです。
まとめ
今回は、Swiftの関数をより柔軟に使うための「デフォルト引数」と「可変長引数」を紹介しました。デフォルト引数を使えば呼び出し側の記述を減らせますし、可変長引数を使えば渡す値の個数を気にせず関数を設計できます。どちらもSwiftならではの厳格な引数ラベルのルールと組み合わさることで、読みやすく間違いにくいコードにつながります。最初はルールが多く感じるかもしれませんが、実際に小さな関数を書いて試してみると、自然と感覚がつかめてくるはずです。ぜひ手元のコードで試してみてください。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Swiftをもっと学びたい方には「これからつくる iPhoneアプリ開発入門」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿