如何在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")