Language
日本語
English

Caution

JavaScript is disabled in your browser.
This site uses JavaScript for features such as search.
For the best experience, please enable JavaScript before browsing this site.

  1. Home
  2. SwiftBeginner - About Internal and External Parameter Names

About Internal and External Parameter Names - Japanese Only

みなさまどうも。

さて、Swift入門編もなんと20話目に突入でございます。ここまでお読み頂いた方は大変お疲れ様でございました、ここまでお読み頂き大変光栄でございます。

そして初めて当サイトを訪れたという方はようこそいらっしゃいました。どうぞごゆっくりされちゃって下さい。

では続きまして『内部引数名』と『外部引数名』についてやっていきましょう。『内部引数名』は『ローカル引数名』とも呼ばれますね。

前回は引数と仮引数について解説をしました。

というわけでちょいと前回勉強した知識を使って処理を書いてみます。以下は「長方形または正方形の面積を出力する処理」でございます。長方形の面積は横幅と高さを乗算すれば良いだけなのでこんな感じになりますね。関数名は『areaOfSquare』としました。

func areaOfSquare(n: Int, _n: Int) { // 長方形または正方形の面積を出力する処理です。
    print(n * _n)
}

areaOfSquare(n: 10, _n: 20) // 数値『200』が出力されます。

上記のサンプルは仮引数『n』と仮引数『_n』を使って処理を構築していますね。

さてこの関数なんですが、仮引数名に使ってる『n』と『_n』という名前だと「引数にどんな値を渡すかよく分からない」という印象を持った方もいらっしゃると思います。

他のプログラム言語でもよくあるパターンなんですが、超複雑な関数なんかになると「あれ?この関数を実行させるときって引数に何を渡せばいいんだっけ?」ということになる場合があります。他のプログラム言語に精通している方はそんな状態になった経験がおありになるかと思います。

そんな悩めるプログラマーのためにSwiftでは『内部引数名』と『外部引数名』を別にできる、という機能が用意されています。その記法をちょいと確認していきましょう。

まず『内部引数名』と『外部引数名』を同じにしたい、といった場合ですがこれはこれまで勉強した内容通り、仮引数名を普通に記述しちゃえばOKです。

func areaOfSquare(width: Int, height: Int) { // 長方形または正方形の面積を出力する処理です。
    print(width * height)
}

areaOfSquare(width: 10, height: 20) // 数値『200』が出力されます。

続いて『内部引数名』と『外部引数名』を別にしたい、といった場合ですね。その場合は以下のようにします。

func areaOfSquare(width n: Int, height _n: Int) { // 長方形または正方形の面積を出力する処理です。
    print(n * _n)
}

areaOfSquare(width: 10, height: 20) // 数値『200』が出力されます。

上記の関数『areaOfSquare』の『()』の中に注目していましょう。『width n: Int, height _n: Int』という風になっていますね。

このように『外部引数名 内部引数名: データ型』とすることで『内部引数名』と『外部引数名』を分けることができます。関数を実行させる場合は『関数名(外部引数名: 値とか)』という記法になります。

この『内部引数名』と『外部引数名』を分ける必要のあるシチュエーションですが、例えば上記の仮引数名を『widthOfSquare』と『heightOfSquare』にしたとしましょう。『width』とか『heigt』という名前にするよりもとっても分かりやすくなったわけなんですが、ちょっとタイピング数が多くて面倒くさい感じもありますよね。そういう時に『内部引数名』と『外部引数名』を分けると良いです。

func areaOfSquare(widthOfSquare n: Int, heightOfSquare _n: Int) { // こんな風に仮引数名が長ったらしい時は『内部引数名』を使ってしまうのが良いかもです。
    print(n * _n)
}

areaOfSquare(widthOfSquare: 10, heightOfSquare: 20)

一応「ファイル容量の節約ができる」というメリットもあるのですが昨今のコンピューターは昔と比べてデータ容量が桁違いなのでこの程度の文字を節約する効果はあんまりなかったりします。

最近は「容量の節約や処理速度の追求よりも開発者がメンテナンスしやすいようにする」という方向に完全シフトしちゃってますね。

(´-`).。oO(昔は1バイト削ることに情熱を燃やしてたもんでございます...)

(´-`).。oO(最近のプログラミングは「他のプログラマーさんに読みやすい処理を書く」という事が評価されがちなので...)

(´-`).。oO(ぶっちゃけあんまり面白みを感じません...)

(´-`).。oO(バグすらも利用しているが故に常人には全く読めないが超爆速かつ超低容量で動く...)

(´-`).。oO(そんな黒魔術と呼ばれるプログラミングが最高評価されてた時代が懐かしいでございます...)

そして逆に関数実行の際に引数名を記述しなくてもOKにしたい、という時は『_』を使用します。以下のサンプルをちょっと見てみましょう。

func areaOfSquare(_ n: Int, _ _n: Int) {
    print(n * _n)
}

areaOfSquare(10, 20)

上記の『_ n: Int, _ _n: Int』という部分に注目です。このように『_ 内部引数名: データ型』とすることで関数実行の際の引数名の記述を省略することができます。

こちらも引数名を記述するのが面倒くさい引数名を記述しなくても問題ないという場合に使用してみて下さい。

ちょっと前のSwiftでは『外部引数名』と『内部引数名』を同じにしたい場合に『#』を付けるという記法がありました。

func test(#s: String, _s: String) { // こんな感じで仮引数名の頭に『#』を付けることで『外部引数名』と『内部引数名』が同じにできるという記法がありました。
    print(s)
    print(_s)
}

この記法、なくなっちゃったのでご注意です。現在の記法だと『外部引数名』を記述しなければ上記と同じ結果になります。

func test(s: String, _s: String) { // こんな感じで『外部引数名』を省略しちゃえばOKです。
    print(s)
    print(_s)
}

test(s: "初音ミク", _s: "Lily")

今回紹介した『外部引数名』ですが、ちょっと前のSwiftでは「第1引数に限り、外部引数名は省略して記述する」というルールがありました。こんな感じですね。

func test(s: String, _s: String) {
    print(s)
    print(_s)
}

test("初音ミク", _s: "Lily") // こんな感じで第1引数に限り『外部引数名:』の記述は省略されてました。

この理由は「第1引数の使い方は関数名に記述されてるはずだから」という事になっていたからです。

しかし、最新のSwiftでは「『_』を使用しない限り『外部引数名』を省略することはできない」という仕様に変更されましたので間違えないように気をつけて下さい。

そして、ちょっと古いSwiftファイルを最新版に書き直す時とかに「もう第1引数の『外部引数名』は省略して書いちゃってるぜ...修正箇所多すぎて大変だぜ...」という事態に出くわすこともあるかと思います。

そういう場合は関数本体に『_』を付けちゃって下さい。こうすることで古いSwiftの文法でコンパイルが通るようになりますでございます。

func test(_ s: String, _s: String) { // 「修正箇所が多すぎてピンチ!」って時はこんな風に関数本体の第1引数の頭に『_』を付けちゃって下さい。
    print(s)
    print(_s)
}

test("初音ミク", _s: "Lily") // 実行できます。

というわけで『内部引数名』と『外部引数名』については以上になりますね。続いての記事では『return』とか『返り値』とかについてやっていきましょう。

ではではこの辺で。またお会いしましょう。

This article was written by Sakurama.

Author's beloved small mammal

桜舞 春人 Sakurama Haruto

A Tokyo-based programmer who has been creating various content since the ISDN era, with a bit of concern about his hair. A true long sleeper who generally feels unwell without at least 10 hours of sleep. His dream is to live a life where he can sleep as much as he wants. Loves games, sports, and music. Please share some hair with him.

If you find any errors or copyright issues, please .