AVAudioPlayerに必要なdo/catch構文に関する質問があります。それは実際には何ですか?AVAudioPlayerのdo/catchは不要ですか?
私が見てきたチュートリアルに従って、コードをどのように見えるかの例を見てみましょう。
1)ここでは、オプションのNSURLをtryステートメントに強制的にアンラッピングしています。 私は今mp3名を変更するとcatchブロックを呼び出す必要がありますが、代わりにavPlayerURLプロパティがnilであるため、try行にnilクラッシュが発生することが想定されます。なぜそれが奪われていないのですか?
do {
let avPlayer1URL = NSBundle.mainBundle().URLForResource("Test", withExtension: "mp3")
avPlayer1 = try AVAudioPlayer(contentsOfURL: avPlayer1URL!)
avPlayer1?.delegate = self
avPlayer1?.numberOfLoops = -1
avPlayer1?.prepareToPlay()
} catch {
print("Error finding AVAudioPlayer 1 file")
}
2)私は、直接URLプロパティをアンラップ強制午前トライラインが呼び出されることはありませんので、それは理にかなってカントー結果は、この場合は1と同じです。したがって、この例では、私は推測悪いコーディングになり、まだチュートリアルの多くは、あなたにこの方法または方法1.
do {
let avPlayer1URL = NSBundle.mainBundle().URLForResource("Test", withExtension: "mp3")!
avPlayer1 = try AVAudioPlayer(contentsOfURL: avPlayer1URL)
avPlayer1?.delegate = self
avPlayer1?.numberOfLoops = -1
avPlayer1?.prepareToPlay()
} catch {
print("Error finding AVAudioPlayer 1 file")
}
3)だから私は、オプションのチェーンを使用してnilをNSURLがないことを確認するために、それを示しています。 mp3が見つからない場合、doブロックをまったく実行しないため、tryラインやcatchブロックを実行しないことになります。したがって、この例のdo/catchの全体は必要ありません。
do {
if let avPlayer1URL = NSBundle.mainBundle().URLForResource("Test", withExtension: "mp3") {
avPlayer1 = try AVAudioPlayer(contentsOfURL: avPlayer1URL)
avPlayer1?.delegate = self
avPlayer1?.numberOfLoops = -1
avPlayer1?.prepareToPlay()
}
} catch {
print("Error finding AVAudioPlayer 1 file")
}
だから私の質問は基本的に
1です)なぜコンパイラは
2)/キャッチを行います(「試す」を使用することが私に言っている)なぜ私は例1
でクラッシュを取得しています3)mp3が存在することを確認するために、オプションの連鎖を使用してもAVAudioPlayerでエラーが発生することはありますか?
お返事ありがとうございます。申し訳ありませんが、明確にするために、私がmp3ファイルが存在することを確認したにもかかわらず、保存方法(例3)を使用すると、AVAudioPlayerは何らかのタイプのエラーをスローすることができますか? – crashoverride777
はい、絶対に、これらは2つの無関係なものです。たとえば、mp3がそこにあるとしましょうが、そのデータは壊れています。あなたの "if avPlayer1URL = NSBundle.mainBundle()..."と入力すると、ファイルはokと表示されますが、ファイルの内容を読み取ることができないため、プレーヤーはエラーをスローします。 – Moritz
ブリリアント、それは私が少し混乱していたものです。あなたはちょうどあなたの答えに書いたそのコメントを置くことができます。ありがとうございました – crashoverride777