[SwiftUI] Sound Effects

Junyoung Park·2022년 8월 18일
0

SwiftUI

목록 보기
9/136
post-thumbnail

How to add sound effects to Xcode project | Continued Learning #9

Sound Effects

  • AVKit을 사용, 오디오를 재생한다.

구현 목표

구현 태스크

  1. 오디오 재생을 담당할 매니저 클래스를 생성한다.
  2. 단일한 작업을 여러 번 실행할 것이기 때문에 싱글턴 패턴으로 작성한다.
  3. 재생할 음악을 프로젝트 폴더 내에서 찾고 재생한다.
  4. 재생 음악의 종류를 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에 이넘 타입을 파라미털 넘겨준 까닭은 파라미터 디폴트 값이 곧바로 뜨기 때문이다. 기존 문자열로 넘길 때와 비교해서 매우 편리하다.
profile
JUST DO IT

0개의 댓글