为啥我在我的 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
。我知道我播放音频文件的设置有效;我正在构建另一个应用程序,它使用完全相同的设置。为什么它告诉我我在这里打开nil
:http://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?的主要内容,如果未能解决你的问题,请参考以下文章