Swift 中的 NSURL 数组错误?

Posted

技术标签:

【中文标题】Swift 中的 NSURL 数组错误?【英文标题】:NSURL Array Error in Swift? 【发布时间】:2015-09-13 17:12:03 【问题描述】:

所以我正在尝试创建一个变量,我可以使用它从我创建的 NSURL 数组中选择随机声音。这是数组,也就是导致错误的那一行:

var levelOneSounds = 
    [
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Barn", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Chicken", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Birds", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Camera", ofType: "mp3")!), NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Cat", ofType: "mp3")!), 
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Crickets", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Glass", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Siren", ofType: "mp3")!), NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Slap", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Snoring", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Toilet Flushing", ofType: "mp3")!),
        NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Wolves Howling", ofType: "mp3")!)
    ]

显然,所有这些都是我存储在 Supporting Files 文件夹中的 mp3 文件。我还在这里创建了音频播放器:

var levelOneAudioPlayer = AVAudioPlayer()

这是我的 viewDidLoad() 方法,我在其中创建随机声音变量并播放该声音:

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    var randomSound = levelOneSounds[Int(arc4random_uniform(UInt32(levelOneSounds.count)))]

    levelOneAudioPlayer = AVAudioPlayer(contentsOfURL: randomSound, error: nil)
    levelOneAudioPlayer.play()

但是,每当我运行它并进入此视图控制器时,我都会在数组中收到以下错误:

线程 1:EXC_BAD_INSTRUCTION(代码 = EXC_1386_INVOP,子代码 = 0 x 0)

我能做些什么来解决这个问题,以便播放随机声音?我是编程新手,所以如果我犯了明显的错误,我深表歉意。谢谢!

这里是资源文件夹照片的链接: http://i.stack.imgur.com/bj3yG.png

【问题讨论】:

哪一行导致错误? 数组初始化导致错误?你检查过 NSBundle.mainBundle().pathForResource aint nil 吗? 聊天第一行代码:var levelOneSounds @MustangXY 我看了一个关于如何将声音添加到项目中的视频教程,我基本上复制了视频中所做的事情,除了我将声音放入一个数组中,而不是将一个声音放入单个变量中,所以我不太确定。就像我说的,我是编程新手@Neo 发生崩溃是因为其中一个(可选)URL 在为 nil 时被解包。检查文件名的拼写,我猜有错字或文件丢失 【参考方案1】:

发生错误是因为您的声音位于资源文件夹的子文件夹中。

基本函数pathForResource:ofType: 不考虑子文件夹。

来自文档:

该方法首先在指定包的非本地化资源目录中查找匹配的资源文件。如果找不到匹配的资源文件,它会在可用的特定语言 .lproj 文件夹的顶层中查找。 (特定语言文件夹的搜索顺序与用户的偏好相对应。)它不会在这些位置的任何其他子文件夹中递归

你必须使用这个功能

NSBundle.mainBundle().pathForResource("Barn", ofType: "mp3", inDirectory:"Level 1")

或者这个更有效的函数可以用一行获取所有 URL

let levelOneSounds = NSBundle.mainBundle().URLsForResourcesWithExtension("mp3", subdirectory:"Level 1")

【讨论】:

好的,谢谢这对第一个错误有很大帮助,但还有一个问题:现在,我在levelOneAudioPlayer = AVAudioPlayer(contentsOfURL: randomSound, error: nil) 行收到了这个错误 - 你知道我能做什么吗解决这个问题还是我应该创建一个关于这个主题的新问题?谢谢! @vadian 查看原始问题中的代码以供参考@vadian levelOneSounds 声明在哪里? levelOneSounds 声明在class SoundGameViewController: UIViewController 的正上方。声明levelOneAudioPlayer = AVAudioPlayer(contentsOfURL: randomSound, error: nil)viewDidLoad() 方法@vadian 中声明 这可能太早了,而且不在课堂上。在创建随机声音之前写一个声明行var levelOneSounds : [NSURL]! 在类内但在任何函数之外,levelOneSounds = NSBundle.mainBundle().URLsForResourcesWithExtension("mp3", subdirectory:"Level 1")viewDidLoad

以上是关于Swift 中的 NSURL 数组错误?的主要内容,如果未能解决你的问题,请参考以下文章

返回一个空的 JSON 数组导致 Swift 中的越界错误

Swift 2 字符串和 NSURL 错误

Swift 中的 NSLocalizedStrings 数组

Swift - Segue 没有被传递正确的数据

如何在swift 3中的不同部分下显示多维数组

从字典数组映射到 Swift 中的数字数组