tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

Xcode Swiftでの関数

前までのSwift系記事でも関数はちらほら出てましたが、改めて。
Swiftの関数宣言や呼び出しはPHP上がりの自分にとってはなかなか
とっつきにくいものがあります。




まずは何も見ないで大体こんな感じだったかな、と思って書いたもの。

func calc(a: Int, b: Int){
    print(String(a) + "+" + String(b) + "=" + String(a+b))
}

var numA = 6
var numB = 8

calc(numA, numB)  // エラー

一見問題ないかのように見えますが関数呼び出しの場所でエラーになります。
エラー内容はmissing argument label 'b:' in call

ラベルbの引数が行方不明ですみたいなこと言われてますね。


ちなみにこれ、前のSwiftでは合っているらしいです。
Swift2.0ではこの書き方ではダメで、関数呼び出し時に第1引数以外は
ラベルを指定する必要があります。

calc(numA, b: numB)

関数呼び出し部分をこう書くことでエラーは回避できます。

なんか冗長だなーと思ったのですが、Swiftでの関数の基本が
このように引数にラベルを書くようになっています。

引数にラベルをつけることで意味がわかりやすくなるのも分かりますが、
どうしてもラベルつけるのめんどくせー!って人にはこんな書き方。

func calc(a: Int, _ b:Int){
    print(String(a) + "*" + String(b) + "=" + String(a*b))
}

var numA = 6
var numB = 8

calc(numA, numB)

関数の実装部分でbの前にアンスコを入れると呼び出し時に
ラベルを書かずに実行することができます。

逆にこう書いた場合、ラベル入りで呼び出すとエラーになります。難儀よのう・・・
あと、アンスコと関数内で使う変数名の間には半角スペースが必要です。
くっつけてしまうと _b という変数名になってしまうので注意しましょう。


こういう関数の書き方も使い方によって様々ですかね・・・
例えば今回の様に引数2つを単に掛け算して式を表示する関数の場合。

これは明らかにラベルをつけるのが冗長なパターンです。

関数名がcalcとなっていますが、これがmultiplicationだったらどうでしょう?
これなら名前から「掛け算する」ことが分かるため、ラベルをつける必要性はないでしょう。