19673

[code]

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController, AVAudioPlayerDelegate {
        var audioPlayer:AVAudioPlayer!
        @IBOutlet var button:UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sample", ofType: "mp3")!)
            //audioPlayer = AVAudioPlayer(contentsOfURL:audioPath)
            audioPlayer.delegate = self
            audioPlayer.prepareToPlay()
    
        }
    
        @IBAction func buttonTapped(sender : AnyObject) {
            if ( audioPlayer.playing ){
                audioPlayer.stop()
                button.setTitle("Stop", forState: UIControlState.Normal)
            }
            else{
                audioPlayer.play()
                button.setTitle("Play", forState: UIControlState.Normal)
            }
        }
    }
    
[/code]

コメントアウトの部分で「Call can throw, but it is not marked with 'try' and the error is
not handled」というエラーが出てしまいます。どなたか解決方法をお教えください。


CC BY-SA 3.0
2015-12-05T23:26:30.850
19667
2015-12-06T05:00:07.667
2015-12-06T04:54:19.650
5519
13543
question
swift
AVFoundationでのBGMの再生について(Swift)


Swift
2より`try`構文によるエラー処理が導入され、標準のAPIは（エラーの起こる可能性のあるメソッド呼び出しは）その方式でエラー処理をしなければならないように変更されました。

[code]

    do {
        audioPlayer = try AVAudioPlayer(contentsOfURL:audioPath)
    } catch let error {
        // ここでエラー処理をする
    }
    
[/code]

エラー処理をきちんとするなら上記のように `do〜try〜catch`を使ってエラーを捕捉します。

エラー処理をしない（エラーが起こったときはクラッシュさせる、あるいはオブジェクトが`nil`になる）で良い場合は、下記のように`try!`や`try?`を利用すると、（エラーを捕捉しないので）`do〜catch`ブロックは不要になります。

下記はエラーのときにクラッシュします。

[code]

    audioPlayer = try! AVAudioPlayer(contentsOfURL:audioPath)
    
[/code]

次のように書くと、エラーが起こったときは`audioPlayer`変数は`nil`になります。

[code]

    audioPlayer = try? AVAudioPlayer(contentsOfURL:audioPath)
    
[/code]


CC BY-SA 3.0
2015-12-06T05:00:07.667
19673
2015-12-06T05:00:07.667
5519
19667
answer