swift言語のインスタンスとイニシャライザ
swiftではクラスのインスタンスを生成する際は引数を渡すことでイニシャライザを呼び出す必要があると認識しています.
そこで質問です.
1つ目のコードの20行目のvar cymbalPlayer = AVAudioPlayer()
はAVAudioPlayer
のインスタンを生成していますが,なぜ引数を渡すことなくインスタンを生成できるのでしょうか.
私は2つ目のコードのように書く必要があると思うのですが,これだと音が一瞬しかな流れないということはわかります.
引数なしのイニシャライザであれば引数を渡さずにインスタンスを生成しますが,引数ありのイニシャライザを保有しているクラスのインスタンスを生成するときはイニシャライザのための引数を渡す必要がありますよね?
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 var cymbalPlayer = AVAudioPlayer() 17 18 @IBAction func cymbal(_ sender: Any) { 19 do { 20 cymbalPlayer = try AVAudioPlayer(contentsOf: cymbalPath, fileTypeHint: nil) 21 22 cymbalPlayer.play() 23 } catch { 24 print("シンバルで、エラーが発生しました") 25 } 26 } 27}
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 @IBAction func cymbal(_ sender: Any) { 17 do { 18 var cymbalPlayer = try AVAudioPlayer(contentsOf: cymbalPath, fileTypeHint: nil) 19 20 cymbalPlayer.play() 21 } catch { 22 print("シンバルで、エラーが発生しました") 23 } 24 } 25}
追加
引数なしのインスタンスを生成した後に,引数ありのインスタンスを代入する
という観点からみれば下のコードのような意味不明なコードになると思うのですが,なぜAVAudioPlayer
は許されるのでしょうか.
swift
1class A { 2 init(string: String){ 3 } 4} 5 6var a = A() 7a = A(string: "~~~")
環境
xcode:10
swift:4.2
言葉足らずでしたらご指摘ください.
回答3件
あなたの回答
tips
プレビュー