Swift:取消包装nil会导致我的程序崩溃

Swift:取消包装nil会导致我的程序崩溃,swift,Swift,我是斯威夫特的新手,我正在学习我的UDE课程 我发现了错误 线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0) 控制台将其解释为“在展开可选值时意外发现nil” 我已经仔细检查了一遍,以确保我的代码与我的导师的代码完全相同,甚至重新启动了一次,以防我把事情搞砸了,但我仍然会遇到同样的错误 我的代码如下: import UIKit import AVFoundation class ViewController: UIView

我是斯威夫特的新手,我正在学习我的UDE课程

我发现了错误

线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0)

控制台将其解释为“在展开可选值时意外发现nil”

我已经仔细检查了一遍,以确保我的代码与我的导师的代码完全相同,甚至重新启动了一次,以防我把事情搞砸了,但我仍然会遇到同样的错误

我的代码如下:

    import UIKit
    import AVFoundation

    class ViewController: UIViewController {
        @IBOutlet weak var darkBlueBG: UIImageView!
        @IBOutlet weak var powerButton: UIButton!
        @IBOutlet weak var cloudHolder: UIView!
        @IBOutlet weak var rocket: UIImageView!
        @IBOutlet weak var hustleLbl: UILabel!
        @IBOutlet weak var onLbl: UILabel!

        var player: AVAudioPlayer!

        override func viewDidLoad() {
            super.viewDidLoad()

            let path = Bundle.main.path(forResource: "hustle-on", ofType: "wav")! //This is the line that the console says is causing the error
            let url = URL(fileURLWithPath: path)

            do {
                player = try AVAudioPlayer(contentsOf: url)
                player.prepareToPlay()
            } catch let error as NSError {
                print(error.description)
            }
        }


        @IBAction func powerButtonPressed(_ sender: Any) {
            cloudHolder.isHidden = false
            darkBlueBG.isHidden = true
            powerButton.isHidden = true

            player.play()

            UIView.animate(withDuration: 2.3, animations: {
            self.rocket.frame = CGRect(x: 0, y: 20, width: 375, height: 402)
            }) { (finished) in
                self.hustleLbl.isHidden = false
                self.onLbl.isHidden = false

            }
        }
    }

根据您标记的行,您的bundle资源中似乎没有包含.wav上的文件
hustle
。仔细检查项目中是否有此文件。如果是,请选择它并查看文件检查器,然后再次检查目标是否已被选中。

请阅读
路径
方法的文档:

它声明此方法可以返回
nil

返回值

资源文件的完整路径名,如果 找不到文件

因此,您应该采取适当的预防措施,使用
guard
if let
打开选装件,以防止碰撞

例如:

if let path = Bundle.main.path(forResource: "hustle-on", ofType: "wav") {
    // work with the path value
} else {
    // take appropriate action since path is nil!
}


您不应打开这样的可选包装,而应使用防护装置或(如果允许)如下所示:

guard let path = Bundle.main.path(forResource: "hustle-on", ofType: "wav") else {
    // Add some logic here because the file wasn't found. Then return because it failed.
    return
}


然后,只有当路径从Bundle.main.path调用返回时,它才会尝试使用该路径。

每次使用
在Swift中,您是说“如果出现任何错误,我希望我的代码在此崩溃”。@rmaddy我不确定这个dupe标志是否有用。OP的问题不是“我不明白解包裹零意味着什么”,而是“我的代码与我的导师的代码相同,为什么我的代码失败而我的导师的代码没有?”目标没有检查,谢谢
guard let path = Bundle.main.path(forResource: "hustle-on", ofType: "wav") else {
    // Add some logic here because the file wasn't found. Then return because it failed.
    return
}
if let path = Bundle.main.path(forResource: "hustle-on", ofType: "wav") {
    let url = URL(fileURLWithPath: path)

    do {
        player = try AVAudioPlayer(contentsOf: url)
        player.prepareToPlay()
    } catch let error as NSError {
        print(error.description)
    }
}