为什么我一直收到这个错误???致命错误:在展开Optional值时意外发现nil

时间:2017-09-11 01:00:35

标签: swift

我正在尝试创建一个内置声音的应用。每当我尝试构建我的程序时,我都会收到此错误:

  

致命错误:在解包可选值时意外发现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!))

如果有人可以帮我修复我的代码那么棒。

3 个答案:

答案 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使用此