web-dev-qa-db-ja.com

Swift 2でiOSアプリケーションでオーディオを使用する方法は?

SpriteKitとSwiftを使用してXcode7ベータ版でゲームを作成し、オーディオを入れようとしましたが、Xcodeが3つのエラーを検出したため、それは不可能です。私は初心者であり、それらを修正する方法がわかりません。

import AVFoundation

    var audioPlayer = AVAudioPlayer()


    func playAudio() {
        // Set the sound file name & extension
        var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!)

        // Preperation
        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)

        // Play the sound
        var error: NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
}

コードのエラーはここにあります:

コード1:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)

エラー1:

呼び出し中の追加の引数「エラー」

コード2:

AVAudioSession.sharedInstance().setActive(true, error: nil)

エラー2:

呼び出し中の追加の引数「エラー」

コード3:

audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)

エラー3:

タイプ '(contentsOfURL:NSURL、エラー:inout NSError?)'の引数リストを受け入れるタイプ 'AVAudioPlayer'の初期化子が見つかりません。

あなたの貢献は私を助けるかもしれません。ありがとう。

10
user5284663

do catch内の関数を使用し、スローする関数にはtryを使用します。

var audioPlayer = AVAudioPlayer()

func playAudio() {
    do {
        if let bundle = NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav") {
            let alertSound = NSURL(fileURLWithPath: bundle)
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        }
    } catch {
        print(error)
    }
}

完全なSwift 2エラー処理の説明については、 この回答 を参照してください。

24
Eric Aya

Swift 2.0でのエラー処理が変更されました。Foundationおよびその他のシステムフレームワークは、tryおよびcatchメカニズムを使用する新しいタイプのエラー処理を使用するようになりました。

Cocoaでは、エラーを生成するメソッドはNSErrorポインターパラメーターの最後のパラメーターを取ります。これは、エラーが発生した場合に引数にNSErrorオブジェクトを設定します。 Swiftは、エラーを生成するObjective-Cメソッドを、Swiftのネイティブエラー処理機能に従ってエラーをスローするメソッドに自動的に変換します。

使用する関数の定義を見ると、それらがスローされることがわかります。例えば:

public func setActive(active: Bool) throws

関数がエラーをスローするため、エラーパラメータがないことがわかります。これにより、NSError処理の手間が大幅に軽減され、作成する必要のあるコードの量も削減されます。

したがって、関数の最後のパラメーターとしてエラーが表示された場合は、それを削除してtry!と記述してください。その前に。一例はこれです:

try! AVAudioSession.sharedInstance().setActive(true)

エラー処理はこの質問の範囲ではないので、それについてもっと読むことができます ここ

これはあなたが書いたコードの修正版です:

import AVFoundation

var audioPlayer = AVAudioPlayer()

func playAudio() {
    // Set the sound file name & extension
    let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!)

    // Preperation
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: [])
    try! AVAudioSession.sharedInstance().setActive(true)

    // Play the sound
    do {
        try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    } catch {
        print("there is \(error)")
    }
}
6
Said Sikira

アイデアは、AVAudioPlayerの拡張を作成し、メソッドを使用して任意のクラスを呼び出すことです。

1)空のSwift 'AppExtensions'という名前のクラスを作成します。以下を追加します。

 //  AppExtensions.Swift

    import Foundation
    import UIKit
    import SpriteKit
    import AVFoundation   

    //Audio
    var audioPlayer = AVAudioPlayer()

    extension AVAudioPlayer {

        func playMusic(audioFileName:String,audioFileType:String)
        {    
            do {

            let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(audioFileName, ofType: audioFileType)!)

           // Removed deprecated use of AVAudioSessionDelegate protocol
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
            audioPlayer.prepareToPlay()
            audioPlayer.play()

            }
            catch {
                print(error)
            }
    }
    }

2)任意のクラスの拡張メソッドを呼び出します。

var audioPlayer1 = AVAudioPlayer()
audioPlayer1.playMusic(audioFileName:"tik",audioFileType:"wav")
0
A.G