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.