如何在Singleton方法中实现AVAudioPlayer?

这是我的代码:

class SomeAudioManager: NSObject { class var sharedInstance: SomeAudioManager{ struct Static { static var onceToken: dispatch_once_t = 0 static var instance: SomeAudioManager? = nil } dispatch_once(&Static.onceToken) { Static.instance = SomeAudioManager() } return Static.instance! } func audioView(songname: NSString,format: NSString) { let audioPlayer:ava audioPlayer=try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(songname, ofType:format)!), fileTypeHint: AVFileTypeMPEGLayer3) audioPlayer!.delegate=self; self.audioPlayer!.play() } } 

该AVAudioPlayer是在NSObject下,但我不能实现它。

当键入让audioPlayer:AVAudio – >它不显示任何东西。

不是说这很有道理,但是这为我编译:

 import AVFoundation class SomeAudioManager: NSObject, AVAudioPlayerDelegate { class var sharedInstance: SomeAudioManager { struct Static { static var onceToken: dispatch_once_t = 0 static var instance: SomeAudioManager? = nil } dispatch_once(&Static.onceToken) { Static.instance = SomeAudioManager() } return Static.instance! } func audioView(songname: String,format: String) { let audioPlayer: AVAudioPlayer do { audioPlayer = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(songname, ofType:format)!), fileTypeHint: AVFileTypeMPEGLayer3) audioPlayer.delegate = self; audioPlayer.play() } catch { // error } } } 

所以你需要导入这个框架,在swift中试试catch是试试看。 其他一些语法失败也是固定的。

Swift中没有使用这种单例。

用法:

 class someOtherClass { func doSomething() { SomeAudioManager().audioView("name_here", format: "format_here") SomeAudioManager.sharedInstance.audioView("name_here", format: "format_here") } } 

至于你的单例部分(从评论)你应该可能使用这样的东西:

 class MyAudioPlayer: NSObject, AVAudioPlayerDelegate { private static let sharedPlayer: MyAudioPlayer = { return MyAudioPlayer() }() private var container = [String : AVAudioPlayer]() static func playFile(name: String, type: String) { var player: AVAudioPlayer? let key = name+type for (file, thePlayer) in sharedPlayer.container { if file == key { player = thePlayer break } } if player == nil, let resource = NSBundle.mainBundle().pathForResource(name, ofType:type) { do { player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: resource), fileTypeHint: AVFileTypeMPEGLayer3) } catch { // error } } if let thePlayer = player { if thePlayer.playing { // already playing } else { thePlayer.delegate = sharedPlayer sharedPlayer.container[key] = thePlayer thePlayer.play() } } } } 

用法是:

 MyAudioPlayer.playFile("Breach", type: "mp3")