我正在尝试创建一个内置声音的应用。每当我尝试构建我的程序时,我都会收到此错误:
致命错误:在解包可选值时意外发现nil
这是我的代码:
var magicSound: AVAudioPlayer = AVAudioPlayer()
@IBOutlet var Answer: UILabel!
var AnswerArray = ["Yes", "No", "Maybe", "Try Again", "Not Now", "No Doubt", "Yes Indeed", "Of course", "Definetley Not"]
var chosenAnswer = 0
override func viewDidLoad() {
super.viewDidLoad()
let magicFile = Bundle.main.path(forResource: "MagicSound", ofType: ".wav")
do {
try magicSound = AVAudioPlayer(contentsOf: URL (fileURLWithPath: magicFile!))
}
catch {
print(error)
}
}
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
if event?.subtype == motion {
printAnswer()
randomAnswer()
animation()
showingAnswerAnimation()
magicSound.play()
}
}
控制台在行
处抛出错误try magicSound = AVAudioPlayer(contentsOf: URL (fileURLWithPath: magicFile!))
如果有人可以帮我修复我的代码那么棒。
答案 0 :(得分:2)
我相信这一行:
let magicFile = Bundle.main.path(forResource: "MagicSound", ofType: ".wav")
应该是:
let magicFile = Bundle.main.path(forResource: "MagicSound", ofType: "wav")
点字符隐含在type
参数中。
我就是这样写的:
if let magicFile = Bundle.main.path(forResource: "MagicSound", ofType: "wav") {
let magicSound = try? AVAudioPlayer(contentsOf: URL (fileURLWithPath: magicFile))
}
else {
print( "MagicSound.wav does not exist in main bundle" )
}
确保文件名是区分大小写的匹配。同时确保资源文件位于包的顶层(即与.xcodeproj
和.xcworkspace
位于同一文件夹中文件)。
答案 1 :(得分:0)
好的, 意外发现nil,而解包一个可选值 是SO中非常常见的错误。您应该在发布问题之前搜索更多内容。
这个// temp is an existing object in db, which you have modified
db.StockInfo.Attach(temp);
db.Entry(temp).State = EntityState.Modified;
db.Savechanged();
是罪魁祸首。 magicFile!
的使用意味着您要打开这样一个值,以确保该值确实包含!
以外的值。但是如果值为nil
,那么您的代码应该崩溃并给出一个暗示,即您假设该值存在错误。所以改变它。
现在来救援了。您有多个选项可以安全地解包可选值。例如nil
。说过你应该改变你的实现,如:
optional-binding
答案 2 :(得分:-1)
尝试使用以下代码希望它有所帮助
func playSound() {
guard let url = Bundle.main.url(forResource: "MagicSound", withExtension: "wav") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
guard let player = magicSound else { return }
player.play()
} catch let error {
print(error.localizedDescription)
}
}
并确保import AVFoundation
使用此