2016-11-24 14 views
0

私はスウィフト2からスウィフト3、および新たな挑戦に直面してイムにアップグレードするだけでVEのオプション値...私は前に完璧に実行するプレーヤーを持ってSwift3:

をアンラップしながら、予想外にnilを見つけましたが、今私が持っていますこの次の問題:ここで

の "オプションの値をアンラップしながら、予想外にnilを見つけるには、" 私のコードです:

print(audioselectionne) 

let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: audioselectionne as String, ofType: "mp3")!) 

私が得たVEの:オプション( "ティエスト")とクラッシュ...

私は本当にどこに問題があるのか​​わかりません...

ありがとうございました。

+2

問題は、あなたが 'pathForResource'の戻り値を強制的にアンラップしていますが、nilでした。リソースが見つかりませんでした。 – Paulw11

+0

はい、私は何も変えておらず、それはSwift 2と一緒に働いていました。 – user2971617

+0

どうしてダウンストリーミングは 'String'ですか?それを取り除く。 – Paulw11

答えて

0

Bundle.main.pathメソッドは、オプションのStringを返します。それがnil(リソースが見つからないため)である場合、強制アンラッピングするとエラーが発生します。あなたが正しくそれを処理したい場合は、nilをチェックする必要があります。

guard let path = Bundle.main.path(…) else { 
    // resource not found, handle error 
} 

// now `path` is guaranteed to be non-nil 
let alertSound = URL(fileURLWithPath: path) 
+0

問題はなぜSwift3でファイルが見つからないのですか?それはかなり変わっています – user2971617

+1

おそらく、Swift 3の以前のコードとは異なるパスが出てきますが、force-unwrap( '!')によって引き起こされるエラーです。あなたが〜を持たない限り値を強制的にアンラップしないでください。 – zoul

+0

実際、これがBundle.main.pathにあると想定されている場合は、エラーを処理せず、パスを修正するか、リソースが存在することを確認してください。 – gnasher729

1

あなたはおそらくオプションの結合で、オプションのラップを解除する必要があります。

ところで、もうパス文字列を使用しないでください。 URLを直接使用してください。

guard let resource = audioselectionne, let alertSound = Bundle.main.url(forResource: resource, withExtension: "mp3") else { 
    // handle file not found here 
    return 
} 

// use alertSound here 
+0

まだ同じ問題...ファイルが見つかりません... – user2971617

+0

audioselectionneは準備をしてからこのように宣言しましたvar audioselectionne:String? – user2971617

+0

私はそれがここで同じ問題だと思います... http://stackoverflow.com/questions/39537177/swift-3-incorrect-string-interpolation-with-implicitly-unwrapped-optionals – user2971617