Reproducción de files de audio aleatorio usando Swift

Sigo obteniendo el siguiente error cuando utilizo el "Gesto de agitación" en el simulador de iPhone:

Error grave: inesperadamente encontrado nulo al desenvolver un valor opcional

Aquí está mi código relevante:

import UIKit import AVFoundation class ViewController: UIViewController { var soundFiles = ["kidLaughing", "pewpew", "pingas", "runningfeet"] var player: AVAudioPlayer = AVAudioPlayer() override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) { if event.subtype == .MotionShake { var randomSoundFile = Int(arc4random_uniform(UInt32(soundFiles.count))) var fileLocation = NSString(string:NSBundle.mainBundle().pathForResource("sounds/" + soundFiles[randomSoundFile], ofType: "mp3")!) var error: NSError? = nil player = AVAudioPlayer(contentsOfURL: NSURL(string: fileLocation), error: &error) player.play() } } } 

Tengo una carpeta llamada sounds con 4 files mp3 ubicados en él. El error está sucediendo en esta línea de código:

  var fileLocation = NSString(string:NSBundle.mainBundle().pathForResource("sounds/" + soundFiles[randomSoundFile], ofType: "mp3")!) 

He intentado todo lo que puedo pensar para que esto funcione, pero nada de lo que he intentado ha funcionado. ¡Se agradece cualquier ayuda!

Esto significa que hay un valor nulo cuando afirmas que no lo es. Separe la línea de locking en sus componentes y descubra exactamente qué es nil:

 var soundFile = soundFiles[randomSoundFile] var path = "sounds/" + soundFile var fullPath = NSBundle.mainBundle().pathForResource(path, ofType: "mp3")! var fileLocation = NSString(string:fullPath) // fyi, this line is pointless, fullPath is already a string 

Supongo que se está estrellando en la línea pathForResource porque el file no se puede encontrar. Asegúrate de vincular el directory de "sonidos" en tu package.

// Puedes probar esta también para reproducción de sonido random.

 import UIKit import AVFoundation class GameScene: SKScene { var pinballVoiceArray = ["BS_PinballBounce1.mp3", "BS_PinballBounce2.mp3", "BS_PinballBounce3.mp3"] var randomIndex = 0 override func didMoveToView(view: SKView) { //use the random sound function playPinballSound() } func playPinballSound () { randomIndex = Int(arc4random_uniform(UInt32(pinballVoiceArray.count))) var selectedFileName = pinballVoiceArray[randomIndex] runAction(SKAction.playSoundFileNamed(selectedFileName, waitForCompletion: false)) } } 

// Llama a la function playPinballSound donde te gustaría reproducir un sonido aleatorio.

  let path = NSBundle.mainBundle().pathForResource("Ring", ofType: "mp3") let fileURL = NSURL(fileURLWithPath: path!) play = AVAudioPlayer(contentsOfURL: fileURL, error: nil) play.prepareToPlay() play.delegate = self play.play() 

Es solo un ejemplo

Yo tuve el mismo problema.

Lo solucioné eligiendo "crear references de carpeta" en lugar de "Crear grupos", al copyr la carpeta con files de sonido en el proyecto.

Espero que esto funcione para usted también. Soy muy nuevo en Swift y en toda la progtwigción de iOS, así que no sé qué ocurre exactamente detrás de escena.

Yo tuve el mismo problema. Lo que hice fue solo "Agregar files a MyProject …" y agregar la carpeta de sonidos completa. Una vez que Swift tuvo la reference a esta carpeta, no hubo necesidad de include la carpeta en el parámetro pathForResource.