【问题标题】:Playing sound in Swift4在 Swift4 中播放声音
【发布时间】: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 的额外步骤

标签: ios swift


【解决方案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

【讨论】:

  • 你的意思是It's var not let而不是It's let not var吗?
【解决方案2】:

这对我有用:

let url = Bundle.main.url(forResource: "note\(sender.tag)", withExtension: "wav")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多