Can't Unwrap Value When using this Line of Code Specifically - ios

I've had this bug where i use avfoundation to make a path to my audio file so when i use this line of code
audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "Alone", ofType: "m4r")!))
audioPlayer.prepareToPlay()
It crashes and gives me
fatal error: unexpectedly found nil while unwrapping an Optional value
I have all the code right as the compiler dosen't show any errors.
I am using Xcode 9 and swift 4

This happen because you do forced unwrapping of non-existed path. Generally it's a bad practice. Try to avoid forced unwrapping.
Try this:
guard let path = Bundle.main.path(forResource: "Alone", ofType: "m4r") else {
print("wrong path")
return
}
let url = URL(fileURLWithPath: path)
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer.prepareToPlay()
Then if you see a "wrong path" in debug console that means the resource with filename "Alone" and extension "m4r" doesn't exist in your app bundle.
Hope this help.

Related

Swift 3 error handling and variable accessibility

I have a question on how to use the new error handling in Swift.
I'm reading contents of a file into a data object:
var overallData: Data?
//load file contents into data object
let dataFileURL = NSURL(string: fileName)
do {
overallData = try Data(contentsOf: dataFileURL as! URL)
} catch {
print("\(error)")
}
The problem is that I always encounter this error message:
fatal error: unexpectedly found nil while unwrapping an Optional value
The problem is that the overallData object is set as nil. But if I don't define a data variable outside the do-catch,
let dataFileURL = NSURL(string: fileName)
do {
overallData = try Data(contentsOf: dataFileURL as! URL)
} catch {
print("\(error)")
}
Later on, I can't use the overallData object because the system keeps telling me it's a variable not defined yet. So it looks like new variables defined in the do-catch loop can only be locally accessed inside the loop.
Do you know how to solve this problem? I do need to use the overallData object elsewhere.
The following answer assumes your error is with the line:
overallData = try Data(contentsOf: dataFileURL as! URL)
If you are getting the "fatal error" on another line, please update your question.
Your error has nothing to do with the do/catch/try.
Your problem is the force unwrapping of dataFileURL which is nil.
Your problem is this line:
let dataFileURL = NSURL(string: fileName)
This is returning nil because fileName isn't a valid URL.
Assuming fileName is a path to a local file, you need to do:
let dataFileURL = URL(fileURLWithPath: fileName)
Also note the use of URL instead of NSURL. There is no sense in using NSURL in Swift 3.

Swift3 : unexpectedly found nil while unwrapping an Optional value

I ve just upgrade from Swift 2 to Swift 3, and i m facing a new challenge...
I have a player which run perfectly before, but now i have this following issue : "unexpectedly found nil while unwrapping an Optional value"
Here is my code :
print(audioselectionne)
let alertSound = URL(fileURLWithPath: Bundle.main.path(forResource: audioselectionne as String, ofType: "mp3")!)
I ve got : Optional("tiesto") and the crash...
I really dont understand where is the issue...
Thanks for the help.
You should unwrap the optional, perhaps with optional binding.
BTW, you shouldn't be use path strings at all anymore. Just use the URL directly, e.g.
guard let resource = audioselectionne, let alertSound = Bundle.main.url(forResource: resource, withExtension: "mp3") else {
// handle file not found here
return
}
// use alertSound here
I think the Bundle.main.path method returns an optional String. When that’s nil (because the resource was not found), force-unwrapping it causes your error. If you want to handle it correctly, you have to check for the nil:
guard let path = Bundle.main.path(…) else {
// resource not found, handle error
}
// now `path` is guaranteed to be non-nil
let alertSound = URL(fileURLWithPath: path)

fatal error: unexpectedly found nil while unwrapping an Optional value

var audioPath = NSURL(fileURLWithPath: Bundle.main.path(forResource: "vellipomaakey", ofType: "mp3")!).
fatal error: unexpectedly found nil while unwrapping an Optional value
Did you see it in the Copy Bundle Resources section? If not, press on + sign to add that mp3 file.
You are force unwrapping your optional, consider the following:
if let res = Bundle.main.path(forResource: "vellipomaakey", ofType: "mp3") {
var audioPath = NSURL(fileURLWithPath:res)
}
This will most likely take away your run time error but it won't solve your issue. The problem here is that the resource you are trying to load is not being found, so Bundle.main.path(forResource: "vellipomaakey, ofType: "mp3") is returning nil.

AVFoundation play sound swift 2

I try to play sound with Swift 2.0
If I write 'try' without '!' I got error
"Errors thrown from here are not handled"
And AVAudioPlayer is not Optional why Xcode request 'try!'
If I write 'try!' my app crash
"unexpectedly found nil while unwrapping an Optional value"
class TouchViewController: UIViewController {
var soundPath:NSURL?
...................
//Play Bipsound
do { soundPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Bipsound", ofType: "wav")!)
var sound = try! AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint: nil)
sound.prepareToPlay()
sound.play() }
Pretend you've never seen the ! force-unwrapping operator in Swift before and stop using it entirely. It's basically the "Crash if this optional contains nil" operator. Use "if let" style optional binding or try/catch as outlined by #LLooggaann in his excellent answer. (voted)
var soundPath:NSURL?
if let path = Bundle.main.path(forResource: "Bipsound", ofType: "wav") {
soundPath = NSURL(fileURLWithPath: path)
do {
let sound = try AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint:nil)
sound.prepareToPlay()
sound.play()
} catch {
//Handle the error
}
}

How to initialize AVAudioPlayer using Swift

I'm creating a game using Swift and SpriteKit in Xcode 6.1 and I can't
get AVAudioPlayer to initialize. I have an SKScene for my menu, and I
want to run music in my "Sounds" folder called "menu.mp3." However, it
crashes every time I run my game. My code is below:
let filePath:NSURL = NSURL(fileURLWithPath: "menu.mp3")!
var er:NSError?
let audioPlayer:AVAudioPlayer = AVAudioPlayer(contentsOfURL: filePath, error: &er)
if (er != nil) {
} else {
audioPlayer.play()
}
I put this in my initializer right after my super.init call. The error I get follows:
fatal error: unexpectedly found nil while unwrapping an Optional value
I've tried a lot of fixes, but I can't figure out what's going wrong.
I've added the AVFoundation framework and imported it to this scene,
but it continues to crash. Is there something wrong with my filePath
that makes my audioPlayer not initialize or something? I've tried
switching to other ways and making different parts optional, but I
can't get it to work. Thanks!
let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as NSURL
func preparePlayer(name:String){
var error:NSError?
let fileUrl = documentsUrl.URLByAppendingPathComponent(name)
// or
// let fileUrl = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent(name)
let audioPlayer = AVAudioPlayer(contentsOfURL: fileUrl, error: &error)
if error == nil {
audioPlayer.play()
}
}
override func viewDidLoad() {
super.viewDidLoad()
preparePlayer("menu.mp3")
}

Resources