我的声音播放得很好,但是我复制了别人的代码,我想理解它。我是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)”
这是什么目的?我们已经在“路径”中存储了音频文件的路径,那么为什么我们需要更多信息?
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
1-是var
而不是let
var xyloSound: AVAudioPlayer?
稍后在此处分配
xyloSound = try AVAudioPlayer(contentsOf: url)
如果您将其声明为let
,则会收到无法更改let
变量的编译错误,并且可选let甚至不适用,因为这意味着对编译器而言您不会更改
2-您在此处使用URL
let url = URL(fileURLWithPath: path)
AVAudioPlayer
期望URL
类型而不是路径(字符串类型)
xyloSound = try AVAudioPlayer(contentsOf: url)
在Docs
中查看init(contentsOf url: URL) throws
答案 1 :(得分:0)
这对我有用:
let url = Bundle.main.url(forResource: "note\(sender.tag)", withExtension: "wav")