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'の初期化子が見つかりません。
あなたの貢献は私を助けるかもしれません。ありがとう。
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エラー処理の説明については、 この回答 を参照してください。
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)")
}
}
アイデアは、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")