当 AVAudioPlayer URL 为 nil 时停止崩溃?

Posted

技术标签:

【中文标题】当 AVAudioPlayer URL 为 nil 时停止崩溃?【英文标题】:Stop crashing when AVAudioPlayer URL is nil? 【发布时间】:2016-05-25 19:41:33 【问题描述】:

我仍然是编码的初学者,但我正在开发一个非常基本的音乐播放器,以了解 Swift 的工作原理。

////Functions

//Play chosen file function
func playChosenFile() 

    //Set up the music file URL.
    let musicFilePathURL = MenuBarModel.mainMenu.URL

    if musicFilePathURL != nil 

        //Initialize audioPlayer with safety.
        do 

            try audioPlayer = AVAudioPlayer(contentsOfURL: musicFilePathURL!)

        

        catch 

        

    

    else if musicFilePathURL == nil 
        //Some code that will make the player do nothing.

    




//Play function
func play() 

    playChosenFile()
    audioPlayer.play()

所以如果我使用 NSOpenPanel() 选择音频文件,musicFilePathURL 会使用 URL 进行初始化。

如果我确实使用 NSOpenPanel() 选择了一个文件,那么 musicFilePathURL 具有所选文件的位置,然后传递给 AVAudioPlayer。一旦我按下播放按钮,函数“play()”就会执行,然后它会执行 playChosenFile() 和 audioPlayer.play()。

如果我在按下播放按钮之前这样做,音乐播放器会播放歌曲。

如果我在选择要播放的任何文件之前按下播放按钮,程序就会崩溃,因为 musicFilePathURL 为 nil。

如果在按下播放按钮之前没有选择文件,我对如何使程序不崩溃感到困惑。例如,如果你打开 VLC,如果你按下播放按钮,它会提示选择一个文件,但如果你决定按下取消,播放器什么也不做。

如果我按下播放按钮但在启动时没有选择音频文件,如何让我的程序不执行任何操作?

【问题讨论】:

【参考方案1】:

您对音频播放器的 try/catch 语句的想法是正确的,但您可能可以在 play() 函数中使用另一个语句。

这样,当 audioPlayer 尝试播放空对象时,将捕获异常,您可以自行处理它,而不是让应用崩溃。

也许是这样的?我会尝试一下,但不幸的是我把我的 Mac 留在了家里。

func play()
    do  
        playChosenFile()
        audioPlayer.play()
     catch 
        print "Error Occurred (Did the user specify a file?)
    

【讨论】:

您不应该捕获由于您(开发人员)未能保护函数输入参数而导致的错误。他应该使用if 语句检查正确的设置,而不是仅仅尝试并捕获最终的错误。 @Roy 我可以让程序惹恼用户,通过使用“else if musicFilePathURL == nil”下的“MenuBarModel.mainMenu.openFile()”强行单击文件,这会打开 NSOpenPanel () 当它为零时。但是,如果他们按下取消,无论如何它都会崩溃。

以上是关于当 AVAudioPlayer URL 为 nil 时停止崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 随机返回 nil

为啥 AVAudioPlayer var 等于 nil? - 斯威夫特

使用 AVAudioPlayer 解包 Optional 值时意外发现 nil

iOS:AVAudioPlayer 只能播放一个文件吗?

NSFileHandler 为资产库视频 url 返回 nil

AVAudioPlayer