为啥 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! 参数......要么采用StringString?。 .. 大多数人倾向于避免强制展开(!),总是选择使用条件(?)。正如乔伊德维拉所说。这是为了防止您的应用在返回 nil 时发生任何崩溃。 【参考方案1】:

您的代码还有另一个问题:一旦您找出为什么 playItnil 并修复它,您会发现 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 应该采用StringString? 参数;不是String!

【讨论】:

以上是关于为啥 AVAudioPlayer var 等于 nil? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AVAudioPlayer 不播放?

为啥我的 AVAudioPlayer 不播放声音?

在新的 iOS 版本中,AVAudioPlayer 数组出现错误的访问错误,但为啥

为啥多维数组的枚举值不等于自身?

为啥整数 0 等于 PHP 中的字符串? [复制]

为啥 Xcode 在 appdelegate.h 文件中使用 AVAudioPlayer Delegate 协议时显示警告?