stackoverflow exchange english swift avfoundation swift2

exchange - ¿Cómo usar audio en la aplicación iOS con Swift 2?



stackexchange math (3)

Hice un juego en Xcode 7 beta usando SpriteKit y Swift, traté de poner Audio en él, pero no es posible porque Xcode encontró 3 errores, soy principiante y no sé cómo solucionarlos.

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() }

El error de código está aquí:

Código 1:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)

Error 1:

Argumento extra ''error'' en la llamada

Código 2:

AVAudioSession.sharedInstance().setActive(true, error: nil)

Error 2:

Argumento extra ''error'' en la llamada

Código 3:

audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)

Error 3:

No se puede encontrar un inicializador para el tipo ''AVAudioPlayer'' que acepta una lista de argumentos de tipo ''(contentsOfURL: NSURL, error: inout NSError?)''

Tu contribución puede ayudarme. Gracias.


Manejo de errores en Swift 2.0 ha cambiado. La Fundación y otros marcos de sistemas ahora usan un nuevo tipo de manejo de errores que usa el mecanismo de prueba y captura.

En Cocoa, los métodos que producen errores toman un parámetro de puntero NSError último parámetro, que rellena su argumento con un objeto NSError si se produce un error. Swift traduce automáticamente los métodos de Objective-C que producen errores en métodos que arrojan un error de acuerdo con la funcionalidad de manejo de errores nativos de Swift.

Si observa la definición de funciones que utiliza, puede ver que ahora arrojan. Por ejemplo:

public func setActive(active: Bool) throws

Puede ver que no hay ningún parámetro de error ya que la función arroja un error. Esto reduce enormemente el dolor de manejo de NSError y también reduce la cantidad de código que necesita para escribir.

Entonces, donde sea que vea el error como el último parámetro en la función, elimínelo y escriba ¡intente! en frente de eso. Un ejemplo es esto:

try! AVAudioSession.sharedInstance().setActive(true)

Dado que el manejo de errores no es el alcance de esta pregunta, puede leer más sobre esto aquí .

Esta es la versión corregida del código que ha escrito:

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)") } }


La idea es hacer una extensión de AVAudioPlayer y usar un método para llamar a cualquier clase.

1) Crea una clase rápida vacía llamada ''AppExtensions''. Agrega lo siguiente.

// 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) Llame al método de extensión en cualquier clase.

var audioPlayer1 = AVAudioPlayer() audioPlayer1.playMusic(audioFileName:"tik",audioFileType:"wav")


Usa las funciones dentro de do catch y usa try para las que lanzan:

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) } }

Consulte esta respuesta para obtener explicaciones completas sobre el manejo de errores de Swift 2.