質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2700閲覧

Swift:引数と戻り値について

Masanari2000

総合スコア15

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/08/05 03:27

現在、swiftを勉強中で、引数と戻り値の部分でつまずいてしまいました。

//一つ目
func showEncounterMessage(monster: String, count: Int) {
print("(count)匹の(monster)が現れた!")
}
showEncounterMessage("スライム", 3)

//二つ目
func getEncounterMessage(monster: String, count: Int) -> String {
return "(count)匹の(monster)が現れた!"
}
let message = getEncounterMessage("スライム", 3)
getEncounterMessage("ゴブリン", 1)

この二つのコードにおいて、引数と戻り値はどのような役割を担っているのでしょうか?

(自分が考えるには、引数は、"スライム", 3 と言う値を受け渡すために必要なのだと考えているのですが、この考えはあっているのでしょうか?
戻り値については、見当もつかないです...)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

flied_onionさんが詳しく書かれているので解決はされていると思いますが、ちょっとだけ追記をしておきます。

showEncounterMessageメソッドも「戻り値がない」を省略した書き方になっています、本当は以下の様に書き何もない状態を戻します。
※戻り値は空のタプルとして受けられますがワーニングが出ます。

swift

1func showEncounterMessage(monster: String, count: Int) -> Void { 2 print("\(count)匹の\(monster)が現れた!") 3} 4 5let void = showEncounterMessage("スライム", count: 3)

戻り値がないので、そこで処理を終えるshowEncounterMessageと指定の型を戻すgetEncounterMessageメソッドという違いだけだと思います。

投稿2016/08/06 01:16

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masanari2000

2016/08/06 13:01

なるほど、実は省略されていただけで、形はあまり変わらないのですね。 ありがとうございました。
guest

0

ベストアンサー

自分が考えるには、引数は、"スライム", 3 と言う値を受け渡すために必要

そうですね、引数(ひきすう)はfunc(function、関数)が外から何かを受け取るために指定します。
(func側、今回で言えばshowEncounterMessage, getEncounterMessageが指定します)
それを使う側はその指定に従って呼び出してあげる必要があります。

今回はStringの引数とIntの引数が必要なので、呼び出すときにそれを一つずつ指定してあげています。
"スライム"と 3 とか "ゴブリン"と 1 とか。

戻り値は関数が処理の結果として何か値を返せる/返したい場合に指定し( -> String)ます。
この場合 getEncounterMessageは (内容は処理してみないとわからないけど)Stringの結果を返すと宣言してますので、関数内でStringを返す(return)してあげる必要があります。その返されたものが戻り値(関数から戻ってくる値)です。

呼び出した側は、関数が返した結果を使っても使わなくても構いません。

swift

1// getEncounterMessage の結果を後で使いたいので messageに代入しておく(受け取る) 2let message = getEncounterMessage("スライム", 3) 3// getEncounterMessage の結果は別に要らない。処理だけしてくれればいいので何にも代入しない(受け取らない) 4getEncounterMessage("ゴブリン", 1)

今のコードではmessageをその先で使っていませんので最後の2行は動作が同じ(どちらも何も起きない)ですが、
最後に

swift

1print(message)

という行を付けてあげると、結果が戻り値が使われることになります。

もう一歩進んで

swift

1print(getEncounterMessage("ゴブリン", 1))

とダイレクトにprintにgetEncounterMessageの戻り値をパスしてあげる事もできます。

投稿2016/08/05 03:43

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masanari2000

2016/08/05 12:58

丁寧な解説、ありがとうございました。 戻り値を使用したい場合、"-> 型"と、"return"を使用しなければならないことは分かりました。 しかし、"getEncounterMessage("ゴブリン", 1)"や、"print(message)"や、"print(getEncounterMessage("ゴブリン", 1))"と言うのは何故必要なのでしょうか? 正常に作動しているかの確認ということなのでしょうか? 理解力が足りていなくてすみません...
flied_onion

2016/08/05 13:34

> 何故必要なのでしょうか? getEncounterMessageは私が書いたコードではないので何故って言われても困りますが、 「戻り値なんてつかわずに直接printしちゃえばいいじゃん」って意味でしょうか? 別にそれでも構いませんが、コードを読みやすくまとめておいたりどこで何が起きるのかをコントロールできたりします。 ただ、関数はなるべく少ない仕事を担当すべきで今showEncounterMessageはメッセージの作成と、メッセージの表示の 2つの仕事を受け持っています。 メッセージの出力方法(print)を直したくても、メッセージのフォーマット(xxが現れた)を直したくてもshowEncounterMessageを直さなくてはいけません。 フォーマットしたメッセージを返すだけにすれば、その文字列をどう扱うかは考えなくてよくなります。これぐらいの規模だと説明が難しいですが、あっちこっちでprintしているプログラムで、「やっぱり文字はアスキーアートで出したい」とか、「ログとしてファイルにも出力したい」とかなった場合にあらゆるshowXXを直さないといけなくなるわけです。 文字列を作るだけの関数と文字列を出すだけの関数(今はないけど)が別れていれば、出力方法を変えたいときは文字列を出すだけの関数を直せばよくなります。というのがメリットです。 説明されるより、ちょっと長いコードを書くと身をもって知ることになる部分かなとは思いますが。 分けたとしてもshowEncounterMessageの中で出力する関数を呼んでもいいわけなんで戻り値はやっぱりいらないじゃんとなるかもしれません。 とりあえず、戻り値の無い関数の存在理由がわかっているならば、その場では使えない値の取得を関数にすることを考えてください。 RPG風のプログラムを考えているなら、セーブデータの読み込みとかでしょうか。 セーブデータは読み込んですぐ出力しておしまいではありません。 そういった値の読み込みは関数にくくりだしたいが、値はその場では使わないときなどに戻り値を使わざるを得ません。 あとは、メッセージを作ったけどさらに加工したいとき。あんまりいい例は浮かびませんが、メッセージスピードを変更できるときとかですかね。 1文字ずつ出すとか1行ずつユーザーの入力待つとか、1行ずつゆっくり出すとか次のメッセージも同時に出すとか出さないそういった調整は関数読んだらすぐprintされてしまうのでできません。 引数増やせばできるかもしれませんがそれではどんどんshowEncounterMessageに何渡せばいいかが難しくなっていくので、それよりは作ったメッセージだけ返してもらって、出し方は別のところで実現する方がシンプルになるでしょう。 繰り返しになりますけどこれぐらいのコードだと実感はわかないかもしれません。 ただ、関数でやることをシンプルにして、それ以上は他の関数でやる方が、コードもすっきりすることが多いです。
Masanari2000

2016/08/06 12:56

なるほど、複雑なコードになってくると今後、必要になってくるのですね。 分かりやすい解説、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問