たけぼーの備忘録

暇を持て余した人間の無意味なブログ

Javaから見たSwiftとの違い ~自作関数編~

こんにちは。
今日は、前回に続きSwiftネタです。

Javaを使ってた人がSwiftを使うと困るときあるよねー、というシリーズです。

前回の記事はこちら。
for文について書きました。

今回は、自作関数についての諸々です。


では、参りましょう!

注意

お約束ですが、この記事はJavaのようなC言語型の構文を持つ言語を使っていた人からみた意見や感想が大いに含まれています。

Swiftに手慣れた方にはとてつもなくしょうもない記事になっていますので、優しい気持ちでお読みください。

Swiftにおける関数

Swiftで自作関数を定義する際には、以下のようにします。

func Function(a:Int){
//aに関する何らかの処理
}

大ざっぱですが、このような形になります。
C言語型のものとは変数型と変数名の宣言の順番が逆になっています。

未だに慣れておりません…
さらに言えば、Intは大文字から打ち始めないといけないところも、よく間違えます。私はなんて低レベルなんだ(笑)

それはさておき、このような宣言方法では、一つ困ったことが起こります。

それは、aに関数内で代入を行えないということです。

例えば、ある配列を引数で受け取って、そこに計算結果を代入していく、といった処理は今の書き方ではできません。

これはどういうことなのでしょうか。このままではほとんどの処理が出来なくなってしまいます。

この原因はSwiftの仕様にあります。Swiftでは、上記のように引数として宣言されたものは、let(定数)として扱われるのです。

定数になってしまう、ということは当然代入できない、ということになりますね。

これは困りましたね。
変数として受け取りたい!そう思いませんか??

変数には出来ないのか?
いえ、そんなことはありません。ちゃんと変数として受け取る方法もあります。

func Function(_ a:inout Int){
//aに関する何らかの処理
//aに代入できる!
}

どこが変わったか分かりましたか?!
引数が_ (変数名):inout (変数型)の形式になっています。
これにて、引数として宣言したものを変数として扱うことが出来ます。

どうも、この書き方をするとC言語で言うポインタ渡しになるようです。

まとめ

定数として宣言されていることに気付かず、かなりの時間エラーと格闘しました。

Xcodeは、varで宣言したものが書き換わることがなければ、『letに書き直しませんか?』的な警告を出してきます。

やはり、Swiftは定数が好きなのか?
そんなになんでも定数にしなくても…と思いますが、使用なので仕方がありません。その方がいろいろとメモリ的に安全なこともあるのかな?

これからも格闘の日々は続きそうです…

ではまた。