当 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 var 等于 nil? - 斯威夫特
使用 AVAudioPlayer 解包 Optional 值时意外发现 nil