播放声音的代码非常冗长,如果可能,希望创建AVAudioSession的扩展。我这样做的方法是将对象分配给变量,但是需要有关如何设置此函数的帮助/建议,以便其可重用和优化。

这是我所拥有的:

func playSound(name: String, extension: String = "mp3") {
    let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension)

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

        UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

        audioPlayer = try AVAudioPlayer(contentsOfURL: sound!)
        audioPlayer?.prepareToPlay()
        audioPlayer?.play()
    } catch { }
}

我想我必须在此函数之外创建audioPlayer变量,否则我很难演奏任何东西。也许可以自我约束?我希望使用这样的东西:
AVAudioSession.sharedInstance().play("bebop")

最佳答案

直接从您的示例中获取代码,我看到两个选择:

1)是否有任何特定原因要将您作为AVAudioSession的扩展?如果没有,请自己做服务!

class AudioPlayerService {

    static let sharedInstance = AudioPlayerService()

    var audioPlayer: AVAudioPlayer?

    func playSound(name: String, extension: String = "mp3") {
        let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension)

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

            audioPlayer = try AVAudioPlayer(contentsOfURL: sound!)
            audioPlayer?.prepareToPlay()
            audioPlayer?.play()
        } catch { }
    }

}

2)如果您使用,则需要将其作为AVAudioSession的扩展,然后看看associated objects
extension AVAudioSession {

    private struct AssociatedKeys {
        static var AudioPlayerTag = "AudioPlayerTag"
    }

    var audioPlayer: AVAudioPlayer? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.AudioPlayerTag) as? AVAudioPlayer
        }

        set {
            if let newValue = newValue {
                objc_setAssociatedObject(
                    self,
                    &AssociatedKeys.AudioPlayerTag,
                    newValue as AVAudioPlayer?,
                    .OBJC_ASSOCIATION_RETAIN_NONATOMIC
                )
            }
        }
    }

    func playSound(name: String, extension: String = "mp3") {
        let sound = NSBundle.mainBundle().URLForResource(name, withExtension: extension)

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

            audioPlayer = try AVAudioPlayer(contentsOfURL: sound!)
            audioPlayer?.prepareToPlay()
            audioPlayer?.play()
        } catch { }
    }

}

10-08 08:52