やろうとしたこと
アラームの機能やBGMを設定で変更できる動作を実装したい!
解決方法
Bundle .main.urlを使う。
以下のような感じでOK
@State private var alarmSoundName: String = "bell"
var endAlarm: URL {
return Bundle.main.url(forResource: alarmSoundName, withExtension: "mp3")!
}
func playAlarm() {
do {
alarmPlayer = try AVAudioPlayer(contentsOf: endAlarm)
alarmPlayer?.play()
} catch {
print("Sound playback failed.")
}
}
この方法だとAssets.xcassetsの中にあるものは呼び出せないのが注意
ワイはSounds みたいな名前のフォルダを作ってそこにまとめて格納したよ。
試したこと
最初は画像の取り出しと同じようにAssets.xcassetsにmp3を保存して NSDataAsset で呼び出そうとしていた。
以下コードのように実装しようとしたところアウト⚠️
@State private var alarmSound: String = "bell"
let endAlarm = NSDataAsset(name: alarmSound)!.data
Swiftのコードでは、NSDataAssetを動的に生成する際に変数(Variable)を使うことはできないらしい。
NSDataAssetの初期化はコンパイル時に行われる必要があるため、変数を使用して動的に生成することはできない。
そこでBundle.main.urlを使った呼び出しではStateを使えたのでうまくいった。
コメントを残す