Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Swift入門編 - 内部引数名と外部引数名について

内部引数名と外部引数名について

みなさまどうも。

さて、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』とか『返り値』とかについてやっていきましょう。

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

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。