为啥 AVAudioPlayer var 等于 nil? - 斯威夫特
Posted
技术标签:
【中文标题】为啥 AVAudioPlayer var 等于 nil? - 斯威夫特【英文标题】:Why the AVAudioPlayer var equals nil? - Swift为什么 AVAudioPlayer var 等于 nil? - 斯威夫特 【发布时间】:2015-05-24 13:17:47 【问题描述】:这是我的功能:
func playMusic(filename :String!)
var playIt : AVAudioPlayer!
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
if url == nil
println("could not find \(filename)")
return
var error : NSError?
playIt = AVAudioPlayer(contentsOfURL: url, error: &error)
if playIt==nil
println("could not create audio player")
return
playIt.numberOfLoops = -1
playIt.prepareToPlay()
playIt.play()
我调试了我的应用,我看到控制台告诉我:无法创建音频播放器
看起来我的playIt
var 为零
我该如何解决?
【问题讨论】:
您检查过error
变量的值吗?
error
拥有您问题的答案。可能还值得检查url
的值,以确保它是您认为的那样......另外,你不应该接受String!
参数......要么采用String
或String?
。 ..
大多数人倾向于避免强制展开(!),总是选择使用条件(?)。正如乔伊德维拉所说。这是为了防止您的应用在返回 nil 时发生任何崩溃。
【参考方案1】:
您的代码还有另一个问题:一旦您找出为什么 playIt
是 nil
并修复它,您会发现 playMusic
运行时没有错误,但没有声音播放。那是因为您已将playIt
声明为playMusic
中的局部变量。就在它开始播放的时候,你到达了playMusic
的结尾,此时它的所有局部变量都超出了范围并不再存在。 playIt
开始播放后的微秒内,它就会消失。
要解决此问题,请在 playMusic
之外声明 playIt
作为实例变量。这是一个视图控制器的代码,它使用您的 playMusic
方法和我的一个建议更改:
import UIKit
import AVFoundation
class ViewController: UIViewController
// Declare playIt here instead
var playIt : AVAudioPlayer!
override func viewDidLoad()
super.viewDidLoad()
playMusic("sad trombone.mp3")
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
@IBAction func buttonPressed(sender: AnyObject)
func playMusic(filename :String!)
// var playIt : AVAudioPlayer! *** this is where you originally declared playIt
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
if url == nil
println("could not find \(filename)")
return
var error : NSError?
playIt = AVAudioPlayer(contentsOfURL: url, error: &error)
if playIt==nil
println("could not create audio player")
return
playIt.numberOfLoops = -1
playIt.prepareToPlay()
playIt.play()
尝试两种方式——将playIt
声明为实例变量,将playIt
作为playMusic
中的局部变量。你会想选择前者。
我也附议 nhgrif 的建议:playMusic 应该采用String
或String?
参数;不是String!
【讨论】:
以上是关于为啥 AVAudioPlayer var 等于 nil? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章
在新的 iOS 版本中,AVAudioPlayer 数组出现错误的访问错误,但为啥
为啥 Xcode 在 appdelegate.h 文件中使用 AVAudioPlayer Delegate 协议时显示警告?