【发布时间】:2019-01-09 14:01:34
【问题描述】:
我的声音播放得很好,但是我复制了别人的代码,我想理解它。我是 Swift 新手,过去没有深入编程,所以请原谅我对术语的滥用 - 我相信我的问题仍然很清楚。
这是我的代码:
import UIKit
import AVFoundation
class ViewController: UIViewController{
var xyloSound: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func Key1(_ sender: UIButton) {
let path = Bundle.main.path(forResource: "note\(sender.tag).wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
xyloSound = try AVAudioPlayer(contentsOf: url)
xyloSound?.play()
} catch {
}
}
}
所以“var xyloSound: AVAudioPlayer?”这行...我猜 AVAudioPlayer 是 AVFoundation 套件中定义的音频播放器的一个实例。所以那行代码创建了音频播放器。我的问题是,为什么我们不写“let”而不是“var”?我了解到“let”用于常量,似乎我们需要创建一个,而且只有一个音频播放器,这听起来像是一个常量。
至于这一行:"let path = Bundle.main.path(forResource: "note(sender.tag).wav", ofType: nil)!"
似乎我们正在创建一个名为 path 的常量,它保存函数 Bundle.main.path 的返回值(该函数有两个参数)。据我了解,这个函数返回的是关联文件名的路径,可能是一个字符串。
现在,下一行:“let url = URL(fileURLWithPath: path)”
这样做的目的是什么?我们已经在“path”中存储了音频文件的路径,为什么还需要更多信息呢?
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
别人的代码很糟糕。首先,正确的语法是
Bundle.main.path(forResource: "note\(sender.tag)", ofType: “wav”)。AVAudioPlayer(contentsOf:需要一个与字符串不同的 URL。Bundle也有与 URL 相关的方法:Bundle.main.url(forResource: "note\(sender.tag)", withExtension: “wav”)。这避免了创建 URL 的额外步骤