Problema con "try?" Y AVAudioPlayer

Estoy teniendo el siguiente problema con AVAudioPlayer:

import Foundation //Needed for dispatch_once_t import AVFoundation //Needed to play sounds class PlayStartSong { var song: AVAudioPlayer = AVAudioPlayer() var songStarted: Bool = false class var shanetworkingInstance: PlayStartSong { struct Static { static var onceToken: dispatch_once_t = 0 static var instance: PlayStartSong? = nil } dispatch_once(&Static.onceToken) { Static.instance = PlayStartSong() } return Static.instance! } func prepareAudios() { var path = NSBundle.mainBundle().pathForResource("start-2.0", ofType: "mp3") song = try? AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!)) //Error Here song.prepareToPlay() song.numberOfLoops = -1 //Makes the song play repeatedly } } 

En la línea que asigna el valor de la variable "canción" en la function "prepareAudios", obtengo el siguiente error después de convertir a Swift 2.0:

Valor del tipo opcional 'AVAudioPLayer?' no desenvuelto; ¿quiso usar '!' o '?'

Sin embargo, al usar la corrección sugerida, me dice que elimine el signo de exclamación que acabo de agregar. ¿Cuál es el problema exacto aquí?

Para usar try? como pretendías que tu variable de song tenga que ser opcional:

 class PlayStartSong { var song: AVAudioPlayer? var songStarted: Bool = false class var shanetworkingInstance: PlayStartSong { struct Static { static var onceToken: dispatch_once_t = 0 static var instance: PlayStartSong? = nil } dispatch_once(&Static.onceToken) { Static.instance = PlayStartSong() } return Static.instance! } func prepareAudios() { let path = NSBundle.mainBundle().pathForResource("start-2.0", ofType: "mp3") song = try? AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!)) song?.prepareToPlay() song?.numberOfLoops = -1 //Makes the song play repeatedly } } 

Para que no sea un Opcional, usaría try dentro de do catch :

 func prepareAudios() { do { let path = NSBundle.mainBundle().pathForResource("start-2.0", ofType: "mp3") song = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!)) song.prepareToPlay() song.numberOfLoops = -1 //Makes the song play repeatedly } catch { print(error) } } 

Además, si está absolutamente seguro de que la creación de la instancia de AVAudioPlayer siempre tendrá éxito, puede ignorar "do catch" usando try! :

 func prepareAudios() { let path = NSBundle.mainBundle().pathForResource("start-2.0", ofType: "mp3") song = try! AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!)) song.prepareToPlay() song.numberOfLoops = -1 //Makes the song play repeatedly }