Swift:取消包装nil会导致我的程序崩溃
我是斯威夫特的新手,我正在学习我的UDE课程 我发现了错误 线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0) 控制台将其解释为“在展开可选值时意外发现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
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)
}
}