在Swift4中播放声音

时间:2018-08-01 21:52:22

标签: ios swift

我的声音播放得很好,但是我复制了别人的代码,我想理解它。我是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)”

这是什么目的?我们已经在“路径”中存储了音频文件的路径,那么为什么我们需要更多信息?

任何帮助将不胜感激。谢谢。

2 个答案:

答案 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")