Swift 4-按下按钮播放声音并获取线程1:致命错误:在展开可选值时意外发现零

Swift 4-按下按钮播放声音并获取线程1:致命错误:在展开可选值时意外发现零,swift,swift4,xcode10,Swift,Swift4,Xcode10,我最近开始学习Swift,想做一个简单的DJ采样器来测试我所学到的当按下UIButton时播放声音的方法 所有12个按钮都在一个@iAction下,并使用标签1-12进行区分 加载模拟器并按下其中一个按钮后,碰撞停止 线程1:致命错误:在展开可选值时意外发现nil 下面是函数中的代码和触发的错误行。任何帮助和建议都将不胜感激。感谢您查看这一条上的代码 import UIKit import AVFoundation class ViewController: UIViewController

我最近开始学习Swift,想做一个简单的DJ采样器来测试我所学到的当按下UIButton时播放声音的方法

所有12个按钮都在一个@iAction下,并使用标签1-12进行区分

加载模拟器并按下其中一个按钮后,碰撞停止

线程1:致命错误:在展开可选值时意外发现nil

下面是函数中的代码和触发的错误行。任何帮助和建议都将不胜感激。感谢您查看这一条上的代码

import UIKit
import AVFoundation


class ViewController: UIViewController, AVAudioPlayerDelegate {

    var audioPlayer : AVAudioPlayer!
    var selectedSoundFileName : String = ""
    let soundArray = ["FRESH", "AIR HORN", "BASS", "CANNON", "BREAK", "CHECK IT", "YEAH BOY", "LIKE THIS", "HIT IT", "AHH", "SAH YEAH", "AWW"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func buttonPressed(_ sender: UIButton) {
        
        selectedSoundFileName = soundArray[sender.tag - 1]
        print(selectedSoundFileName)
        playSound()
    }
    
    // all 12 buttons are under one @IBAction and differentiated by using tags 1-12
    func playSound(){
        
        let soundURL = Bundle.main.url(forResource: selectedSoundFileName, withExtension: "wav")
        
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: soundURL!) 
        } // audioPlayer line above triggers - Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value // 
        catch {
            print(error)
        }
        
        audioPlayer.play()
        
    }
    
}

看起来这条线有问题:

audioPlayer = try AVAudioPlayer(contentsOf: soundURL!)
我喜欢打电话给
“强制展开”操作符“如果无则崩溃”操作符。如果它引用的变量包含nil,则会导致硬崩溃,并显示错误消息“在展开可选值时意外发现nil”

假设您正在使用force unwrap操作符,并且得到了确切的错误消息,那么您的变量
soundURL
应该是零。您应该在打印
soundURL
内容的崩溃行上方添加一条打印语句。或者在该行设置断点并检查该变量中的值。确认变量为零。然后找出原因。可能的原因是,您试图引用的文件不存在于您指定的位置,并且不具有您指定的文件名


您可能需要打印主捆绑包的资源路径(
print(bundle.main.resourcePath)!
)。然后从模拟器运行应用程序,复制路径,转到查找程序,按shift“G”命令粘贴该路径,并检查应用程序包的资源路径。是否有名为
.wav
的文件(其中
是您的文件名?我打赌没有。(注意,名称需要完全匹配,包括相同的大小写。)

不要发布代码的图片。编辑您的问题,将代码粘贴到其中,选择该代码,然后点击“{}”按钮设置该代码的格式。然后指出哪一行失败,并告诉我们确切的错误消息。@Duncac感谢您在下面提供的宝贵反馈和注释!进行了上面的更改并正在进行代码更新。再次感谢