2016-03-29 9 views
1

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でエラーが発生することはありますか?

答えて

3

avPlayerURLプロパティがnilであるため、試行行にnilクラッシュが発生します。なぜそれが奪われていないのですか? DO-キャッチして扱う

スウィフトのエラーは、それが例外をキャッチしないエラーをキャッチ。

nilをアンラッピングするオプションで例外が発生しても、エラーは発生しません。

したがって、この問題は、仕様では、catchにキャッチされていません。 AVAudioPlayerためcatchを使用して

はAVAudioPlayer 自体がエラーをスローした場合、このエラーがキャッチされることを意味します。

そして、良い方法は、このようNSErrorにエラーメッセージをダウンキャストすることで、スローされたエラーの内容を表示するには:

do { 
    // ... 
} catch let error as NSError { 
    print(error.debugDescription) 
} 

のは、たとえば、あなたがMP3ファイルを持っていると言うが、このファイルのデータは破損しており再生できません。

ファイルが3番目の例のように存在することを確認すると、ファイルはokとみなされますが、プレーヤーはファイルの内容を読み取ることができないため、エラーが発生します。

+0

お返事ありがとうございます。申し訳ありませんが、明確にするために、私がmp3ファイルが存在することを確認したにもかかわらず、保存方法(例3)を使用すると、AVAudioPlayerは何らかのタイプのエラーをスローすることができますか? – crashoverride777

+0

はい、絶対に、これらは2つの無関係なものです。たとえば、mp3がそこにあるとしましょうが、そのデータは壊れています。あなたの "if avPlayer1URL = NSBundle.mainBundle()..."と入力すると、ファイルはokと表示されますが、ファイルの内容を読み取ることができないため、プレーヤーはエラーをスローします。 – Moritz

+0

ブリリアント、それは私が少し混乱していたものです。あなたはちょうどあなたの答えに書いたそのコメントを置くことができます。ありがとうございました – crashoverride777

関連する問題