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

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

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

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

Q&A

解決済

1回答

787閲覧

inoutと参照渡しについて

tatuya51

総合スコア23

Swift

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

0グッド

0クリップ

投稿2020/04/13 11:58

iPhoneアプリ開発講座の音楽アプリ作成中のことです。
初歩的な質問となりますがご回答いただけたら幸いです。

「AVAudioPlayer」クラスの変数に「inout」が指定されているのは、引数として受け取り、最後に戻り値としてこの変数を戻すという説明でした。
ですが、なぜ「inout」を使用して戻り値として戻してあげないといけないのか、また戻り先がどこであるかわからないことが一つ。

2つ目は「soundPlayer」の第一引数「&backmusicPlayer」が参照渡しでありことはわかりました。
ですが、なぜ参照渡しでなければならないのでしょうか。
仮に値渡しであった場合は何ができなくなってしまうのでしょうか。

swift

1 let backmusicPath = Bundle.main.bundleURL.appendingPathComponent("backmusic.mp3") 2 3 var backmusicPlayer = AVAudioPlayer() 4 5 @IBAction func play(_ sender: Any) { 6 7 soundPlayer(player: &backmusicPlayer, path: backmusicPath, count: -1) 8 9 } 10 11 fileprivate func soundPlayer(player: inout AVAudioPlayer, path: URL, count: Int) { 12 13 do { 14 15 player = try AVAudioPlayer(contentsOf: path, fileTypeHint: nil) 16 player.numberOfLoops = count 17 player.play() 18 19 } catch { 20 21 print("エラーが発生しました") 22 23 } 24 } 25

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

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

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

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

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

guest

回答1

0

ベストアンサー

ですが、なぜ「inout」を使用して戻り値として戻してあげないといけないのか、また戻り先がどこであるかわからないことが一つ。

引数として与えているbackMusicPlayerという変数が指している先(正確にはインスタンスそのもの)を書き換える必要があるためです。

ちなみに、inoutとは、引数として与えた変数の中身(参照先)そのものを書き換えるための一種の指示です。

2つ目は「soundPlayer」の第一引数「&backmusicPlayer」が参照渡しでありことはわかりました。
ですが、なぜ参照渡しでなければならないのでしょうか。
仮に値渡しであった場合は何ができなくなってしまうのでしょうか。

参照渡しにしてあげないと、変数が参照している「インスタンスそのもの」を書き換えることができないためです(やや語弊はありますが、多分この言い方のほうがわかりやすいと思います)。

過去にこれとほぼ同じ内容のteratailでの質問(参考にしている書籍も同じです)に回答していますので、こちらも参考にしてみてください。

この回答の中に、Playgroundを使ってクラスの参照渡しと値渡しの実験例を載せています。
是非実行してみて違いを試してみてください。

もしそれでもわかりにくければ、どの点がわからないのか追記してみてください。

  • [Swiftの変数について(エクスクラメーションマークの意味) -> この質問の(3)番目

](https://teratail.com/questions/248438)

投稿2020/04/13 12:19

TsukubaDepot

総合スコア5086

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

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

tatuya51

2020/04/13 23:20

早速のご回答ありがとうございます。 たぶん私の中で勘違いしていた部分がありまして、soundPlayer(player:&backmusicPlayer, path: backmusicPath, count: -1)が音楽を再生していると思っていましたが、あくまでもsoundPlayerメソッドは命令でしかなく、考え方として正しくはvar backmusicPlayer =AVAudioPlayer()のインスタンスで実行されているという考え方で合っていますでしょうか? (であれば確かに参照渡しでインスタンスそのものを書き換えるということに繋がりますね、、) また、リンク先のコードに関しては理解するのに時間がかかりそうなので、じっくりと試させていただきます。 ご丁寧にありがとうございます。
TsukubaDepot

2020/04/13 23:49

実際に再生しているのは、soundPlayer()の中に記述されている player.play() の部分ですね。 var backmusicPlayer =AVAudioPlayer() はインスタンスを作っている(音楽の再生のための基本的な準備を行なっている)だけです。 この書籍の該当する記述は、共通処理をメソッド(関数)にして使いまわせるようにしましょう、ということなのですが(たしかリファクタリングという話が挙がっていたかと思います)、少し流れが強引にも感じられますし、この段階ではinoutはあまり本質的ではないので(この書籍ではこれ以降取り上げられていないので)、ここでは「そんなものか」程度で流したほうがいいかと思います。
tatuya51

2020/04/14 13:26

完全に混乱しています、、、笑 いったん時間を置いて再度じっくり回答を読ませて頂きます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問