swift言語のAVAudioPlayerの使い方が分かりません.
1つ目のコードではAVAudioPlayerのインスタンスを生成した後に,音楽ファイルを指定しています.
しかし,AVAudioPlayerはイニシャライザとして「contentsOf:」を設けているので,インスタンス生成時に引数を渡す必要があると認識しています.
ど素人が,クラスが引数付きのイニシャライザを宣言しているにも関わらず,引数なしでインスタンスを生成した後に,引数ありのインスタンスを代入する
という観点からみれば2つ目のコードと同じことをしているのではないかと思ってしまうのですが,もちろん間違っていることはわかります.
では,なぜ1つ目のコードにあるように,AVAudioPlayerは,引数付きのイニシャライザを宣言しているにも関わらず,引数なしのインスタンスを生成できる
のでしょか
プログラミング初心者の自分でもわかるよう教えていただけると助かります.
swift
1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 } 9 10 override func didReceiveMemoryWarning() { 11 super.didReceiveMemoryWarning() 12 } 13 14 let cymbalPath = Bundle.main.bundleURL.appendingPathComponent("cymbal.mp3") 15 16 //////////ここでインスタンスを生成////////// 17 var cymbalPlayer = AVAudioPlayer() 18 19 @IBAction func cymbal(_ sender: Any) { 20 do { 21 //////////ここでイニシャライザを指定////////// 22 cymbalPlayer = try AVAudioPlayer(contentsOf: cymbalPath, fileTypeHint: nil) 23 24 cymbalPlayer.play() 25 } catch { 26 print("error") 27 } 28 } 29}
swift
1class A { 2 init(string: String){ 3 } 4} 5 6var a = A() 7a = A(string: "~~~")
環境
xcode:10
swift:4.2
言葉足らずでしたらご指摘ください.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答3件
1
自己解決
MasakiHoriさんのコメントで解決することができました.
Objective-Cで書かれていて継承ツリーの中にinit()があれば使えます。そう決まってます。 NSObjectにinit()があるのでNSObjectを継承していたら init() が使えます。
回答してくださった皆様,ありがとうございました.
投稿2019/01/23 14:09
総合スコア109
0
編集で追記した部分について。
なぜ1つ目のコードにあるように,AVAudioPlayerはインスタンスを生成した後に,イニシャライザを指定できるのでしょか
イニシャライザを指定できる
という言い回しがちょっと意味不明なのですが、cymbalPlayerはvar
で定義されているので、何度でもインスタンスを入れ直すことは出来ます。
swift
1//OK 2var cymbalPlayer = AVAudioPlayer() 3cymbalPlayer = AVAudioPlayer() 4 5//NG 6let cymbalPlayer = AVAudioPlayer() 7cymbalPlayer = AVAudioPlayer()
投稿2019/01/22 00:28
総合スコア16731
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答へのコメント
2019/01/23 09:22
2019/01/23 09:44
2019/01/23 09:54
2019/01/23 13:00
2019/01/23 14:11
2019/01/24 01:00
2019/01/24 01:03

0
test environment
- macOS Mojave 10.14.2
- Xcode 10.1 Build version 10B61
- Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
以下のように書くと理解しやすいかな。
swift
1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController { 5 6 var player: AVAudioPlayer! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view, typically from a nib. 11 12// var player = AVAudioPlayer() 13 14 let musicPath = Bundle.main.bundleURL.appendingPathComponent("music.mp3") 15 16 do { 17 try player = AVAudioPlayer(contentsOf: musicPath, fileTypeHint: nil) 18 player.play() 19 } catch { 20 print(error) 21 } 22 } 23 24 25}
var player = AVAudioPlayer()
はインスタンス生成というよりはプロパティの宣言と考える。
音を鳴らすにはインスタンスプロパティとして保持する必要があります。
var player = AVAudioPlayer()
をviewDidLoad()
の中に書いてしまうと解放されてしまうので、音が鳴りません。二つ目のコードも同様です。
「var player = AVAudioPlayer()はインスタンス生成というよりはプロパティの宣言と考える。」 とありますが,参考書では「// シンバル用のプレイヤーインスタンスを作成」となっており,どちらが正しいのか困惑しております.
swift
1// シンバル用のプレイヤーインスタンスを作成 2var cymbalPlayer = AVAudioPlayer() 3 4@IBAction func cymbal(_ sender: Any) { 5do { 6// シンバル用のプレイヤーに、音源ファイル名を指定 7cymbalPlayer = try AVAudioPlayer(contentsOf: cymbalPath, fileTypeHint: nil)
参考書の方を採用してください。余生混乱させてしまいましたね。失礼いたしました。var player: AVAudioPlayer!
と書いて初期化せず宣言だけの記述にした方が理解しやすいかと思ったのですが、参考書の説明の流れなら参考書を。
「var player = AVAudioPlayer()をviewDidLoadの中に書いてしまうと解放されてしまう」 とありますが,解放とはなんでしょうか.
そのお使いの参考書に変数のスコープ、有効範囲について書かれている箇所はありますか。
AVAudioPlayer
インスタンスを保持する変数をviewDidLoad()
メソッドのローカル変数として定義するとメソッドの終了とともに変数も無くなります。
投稿2019/01/04 08:26
編集2019/01/04 12:20総合スコア1698
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答へのコメント
2019/01/04 10:32 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2019/05/18 07:00 編集
2019/05/18 11:05