[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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN