为啥我在我的 Swift 文件中解包 nil?

Posted

技术标签:

【中文标题】为啥我在我的 Swift 文件中解包 nil?【英文标题】:Why do I unwrap nil in my Swift file?为什么我在我的 Swift 文件中解包 nil? 【发布时间】:2015-03-02 22:34:19 【问题描述】:

我有一个搜索 iTunes 商店并以 JSON 格式返回数据的应用程序(与我之前关于打开 nil 的帖子相同。我现在真的讨厌 nil。)。我有它的工作,它得到歌曲名称,艺术家姓名,一切!我创建了一个@IBAction 按钮来播放歌曲的预览。 JSON 有一个属性,即歌曲预览的 url。当我单击按钮时,它会执行以下操作:

        let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(url, ofType: "m4a")!)
        AVAudiosession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)
        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()

url 是:http://a1993.phobos.apple.com/us/r1000/101/Music/b7/b3/e0/mzm.ooahqslp.aac.p.m4a。我知道我播放音频文件的设置有效;我正在构建另一个应用程序,它使用完全相同的设置。为什么它告诉我我在这里打开nilhttp://a1993.phobos.apple.com/us/r1000/101/Music/b7/b3/e0/mzm.ooahqslp.aac.p.m4a? url 有效并且文件播放。

【问题讨论】:

【参考方案1】:

检查这行代码。

let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(url, ofType: "m4a")!)

fileUrlWithPath 要求提供本地路径,即您设备上的路径。

NSBundle.mainBundle().pathForResource(url.....

此方法返回您发送给它的资源的本地路径。您正在向它发送一个 web url,它不在 mainBundle 中,除非您明确将其放在那里。所以它返回的路径是 nil,因为没有满足你传递给它的参数的本地路径。

【讨论】:

我怎样才能让它在网络上做一个文件? 使用您从 JSON 中获得的未经编辑的路径(也许您将它包含的内容作为示例发布) 网址是http://a1993.phobos.apple.com/us/r1000/101/Music/b7/b3/e0/mzm.ooahqslp.aac.p.m4a,只用audioPlayer = AVAudioPlayer(contentsOfUrl: url, error &error)播放文件? 我不认为 AVAudioPLayer 会让你直接播放流文件,至少是简单的。您可能最好的下一步就是将音频下载到文件中,然后播放。请参阅此(基于目标 c)的答案。 ***.com/questions/1605846/…【参考方案2】:

如果你有一个本地资源,你应该使用一个叫做 URLForResource 的方法

这条线没有意义。您应该始终更喜欢使用 url 并在需要时从中提取路径。

替换这一行:

let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("fileName", ofType: "m4a")!)  // this would crash if not found (nil)

使用这段代码

if let alertSoundUrl =  NSBundle.mainBundle().URLForResource("fileName", withExtension: "m4a") 
    println(true)
 else 
    println(false)

如果是网页链接,则需要使用 NSURL(string:)。 fileUrlWithPath 仅用于本地资源。

if let checkedUrl = NSURL(string: "http://a1993.phobos.apple.com/us/r1000/101/Music/b7/b3/e0/mzm.ooahqslp.aac.p.m4‌​") 
    println(true)
 else 
    println(false)

【讨论】:

以上是关于为啥我在我的 Swift 文件中解包 nil?的主要内容,如果未能解决你的问题,请参考以下文章

我无法从 plist 键值中解包值

python ValueError:在元组中解包的值太多

为啥 FileHandle 不一致地返回“nil”

在 Swift 中对 Optional 值进行测试后解包时出错

解包需要长度的字符串参数:Windows 问题?

无法在 JBoss EAP 6 中解包 TmesTen 数据源 JDBC 对象