在隐式展开可选值 AVAUDIO Player SWIFT 时意外发现 nil
Posted
技术标签:
【中文标题】在隐式展开可选值 AVAUDIO Player SWIFT 时意外发现 nil【英文标题】:Unexpectedly found nil while implicitly unwrapping an Optional value AVAUDIO Player SWIFT 【发布时间】:2021-02-17 22:39:06 【问题描述】:我目前正在从 firebase 下载一个 m4a 文件并尝试使用 AVAudio Player 播放该文件。
系统如何工作
-
以字符串形式获取下载文件的路径
let pathForAudio: String = UserDefaults.standard.string(forKey: "path") ?? "There is no path for the audio"
-
转换为网址
let url = URL(string: pathForAudio)
-
将 URL 传递给 AVAUDIOPLAYER 函数
soundPlayer = try AVAudioPlayer(contentsOf: url!)
在执行 soundPlayer.play() 时,我得到“在隐式展开可选值时意外发现 nil”
我在 Stack Before 上看到过这个问题,他们只是启用了静态文件的权限。这里的文件路径总是改变,所以我无法执行他们的解决方案。
非常感谢任何帮助,如果您需要其他代码块,请告诉我。非常感谢!
【问题讨论】:
是路径“/some/thing”还是URI“file://some/thing”。如果是前者你需要 URL(path: url) 【参考方案1】:你可以这样定义你的路径:
let pathForAudio: String = UserDefaults.standard.string(forKey: "path") ?? "There is no path for the audio"
这可能导致:
UserDefaults
中存储的有效文件路径
UserDefaults
中存储的文件路径无效
UserDefaults
中没有存储任何内容,这将导致它成为"There is no path for the audio"
除非您遇到场景 #1,否则您的下一次调用 (let url = URL(string: pathForAudio)
) 将失败,返回一个 nil
值(这就是现在发生的情况。然后,在调用 try AVAudioPlayer(contentsOf: url!)
时,因为您要强制展开使用!
,您将遇到崩溃,因为您有一个nil
值,您通过使用!
简而言之,您需要将有效路径放入UserDefaults
才能使该系统正常工作。
我还会在此过程中进行一些错误检查。比如:
guard let pathForAudio = UserDefaults.standard.string(forKey: "path") else
//handle the fact that there wasn't a path
return
guard let url = URL(string: pathForAudio) else
//handle the fact that a URL couldn't be made from the string (ie, invalid path
return
//see if the file exists
guard FileManager.default.fileExists(atPath: pathForAudio) else
//handle no file
return
do
soundPlayer = try AVAudioPlayer(contentsOf: url) //notice there's now no !
catch
//handle error
print(error)
【讨论】:
我确信 UserDefault 已填充。在传入字符串之前,我使用了打印语句,并且字符串与我想要的匹配。这可能是 Xcode 的权限问题吗? print(url!, "URL to Setup Player") 在控制台中运行时不为零 路径是本地资源吗?打印时的价值是多少?您应该有权访问您的捆绑包或应用程序文档文件夹中的任何内容,但您不一定有权访问其他任何内容。 您是否在 Finder 中访问过该目录以确保那里确实有一个文件?此外,我更新了我的答案,使用 FileManager 检查文件是否存在 谢谢,这是文件路径错误和权限问题。以上是关于在隐式展开可选值 AVAUDIO Player SWIFT 时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误
Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]
致命错误:使用 AVAudio 展开可选值时意外发现 nil
想要将 Slidervalue 设置为 UserDefault:线程 1:致命错误:在隐式展开可选值时意外发现 nil [重复]