在隐式展开可选值 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 值,您通过使用!

告诉系统不是 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的主要内容,如果未能解决你的问题,请参考以下文章

Swift:错误:在隐式展开可选值时意外发现 nil

UITableViewCell 中的 AVPlayer 导致“在隐式展开可选值时意外发现 nil”错误

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]

致命错误:使用 AVAudio 展开可选值时意外发现 nil

想要将 Slidervalue 设置为 UserDefault:线程 1:致命错误:在隐式展开可选值时意外发现 nil [重复]

不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil