¿Extensión reutilizable para reproducir sonido sin pérdida de memory en iOS y Swift?

Reproducir un sonido es tan detallado en el código y me gustaría crear una extensión de AVAudioSession si es posible. La forma en que lo hago es asignar un object a una variable, pero necesito ayuda / asesoramiento sobre cómo configurar esta function para que sea reutilizable y optimizada.

Esto es lo que tengo:

func playSound(name: String, extension: String = "mp3") { let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension) do { try AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.shanetworkingInstance().setActive(true) UIApplication.shanetworkingApplication().beginReceivingRemoteControlEvents() audioPlayer = try AVAudioPlayer(contentsOfURL: sound!) audioPlayer?.prepareToPlay() audioPlayer?.play() } catch { } } 

Creo que tengo que crear la variable audioPlayer fuera de esta function, de lo contrario me costó mucho jugar. ¿Tal vez puede ser autónomo? Espero usar algo como esto:

 AVAudioSession.shanetworkingInstance().play("bebop") 

Solutions Collecting From Web of "¿Extensión reutilizable para reproducir sonido sin pérdida de memory en iOS y Swift?"

Tomando el código directamente de su ejemplo, veo dos opciones:

1) ¿Hay alguna razón particular por la que quieres convertirla en una extensión de AVAudioSession? De lo contrario, ¡haga su propio service!

 class AudioPlayerService { static let shanetworkingInstance = AudioPlayerService() var audioPlayer: AVAudioPlayer? func playSound(name: String, extension: String = "mp3") { let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension) do { try AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.shanetworkingInstance().setActive(true) UIApplication.shanetworkingApplication().beginReceivingRemoteControlEvents() audioPlayer = try AVAudioPlayer(contentsOfURL: sound!) audioPlayer?.prepareToPlay() audioPlayer?.play() } catch { } } } 

2) Si necesita hacerlo como una extensión de AVAudioSession, entonces eche un vistazo a los objects asociados

 extension AVAudioSession { private struct AssociatedKeys { static var AudioPlayerTag = "AudioPlayerTag" } var audioPlayer: AVAudioPlayer? { get { return objc_getAssociatedObject(self, &AssociatedKeys.AudioPlayerTag) as? AVAudioPlayer } set { if let newValue = newValue { objc_setAssociatedObject( self, &AssociatedKeys.AudioPlayerTag, newValue as AVAudioPlayer?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC ) } } } func playSound(name: String, extension: String = "mp3") { let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension) do { try AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.shanetworkingInstance().setActive(true) UIApplication.shanetworkingApplication().beginReceivingRemoteControlEvents() audioPlayer = try AVAudioPlayer(contentsOfURL: sound!) audioPlayer?.prepareToPlay() audioPlayer?.play() } catch { } } } 

Esta es la mejor manera que he encontrado para agregar sonido

Nombre de file es shootMissile.wav

 func shootMissileSound() { if let soundURL = NSBundle.mainBundle().URLForResource("shootMissile", withExtension: "wav") { var mySound: SystemSoundID = 0 AudioServicesCreateSystemSoundID(soundURL, &mySound) AudioServicesPlaySystemSound(mySound); } }