How to add sound effects to Xcode project | Continued Learning #9
AVKit
을 사용, 오디오를 재생한다. enum
으로 선언한다. do {
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch {
print(error.localizedDescription)
}
play()
함수는 실패 가능한 함수이기 때문에throw
를 캐치하는do/catch
로 작성한다. 혹은try?
를 통해catch
를 받지 않는 작성법도 있지만, 정석을 준수하자.
import SwiftUI
import AVKit
class SoundManager {
static let instance = SoundManager()
var player: AVAudioPlayer?
enum SoundOption: String {
case rainfall = "rainfall"
case medieval = "medieval"
}
func playSound(sound: SoundOption) {
guard let url = Bundle.main.url(forResource: sound.rawValue, withExtension: ".mp3") else { return }
do {
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch {
print(error.localizedDescription)
}
}
}
struct SoundEffectsBootCamp: View {
private let soundManager = SoundManager.instance
var body: some View {
VStack(spacing: 40) {
Button("Play Sound 1") {
soundManager.playSound(sound: .rainfall)
}
Button("Play Sound 2") {
soundManager.playSound(sound: .medieval)
}
}
}
}
Testable
요소를 저해하는 anti-pattern
이기 때문에, 실제 코드에서는 DI를 통해 의존성을 낮출 필요가 있다. playSound
에 이넘 타입을 파라미털 넘겨준 까닭은 파라미터 디폴트 값이 곧바로 뜨기 때문이다. 기존 문자열로 넘길 때와 비교해서 매우 편리하다.