If you're using the Swift Playgrounds app (for Mac and iPad)...
You need to first add a sound file to the project:
Press the “+” icon
Tap the paper icon
Tap Insert From…
Insert a sound file from the Files app
Then, if you're using SwiftUI:
Code Block import AVFoundationimport SwiftUIimport PlaygroundSupportstruct SwiftUIAudioPlayerView: View { /// the audio player that will play your audio file. Can't be a local variable. /// Must be a `@State` property because we need to modify it later @State var audioPlayer: AVAudioPlayer? var body: some View { Button(action: { self.playAudio() /// play audio when tapped }) { Text("Play Audio!") /// what the button looks like } } func playAudio() { /// function to play audio /// the URL of the audio file. /// forResource = name of the file. /// withExtension = extension, usually "mp3" if let audioURL = Bundle.main.url(forResource: "slow-spring-board", withExtension: "mp3") { do { try self.audioPlayer = AVAudioPlayer(contentsOf: audioURL) /// make the audio player self.audioPlayer?.numberOfLoops = 0 /// Number of times to loop the audio self.audioPlayer?.play() /// start playing } catch { print("Couldn't play audio. Error: \(error)") } } else { print("No audio file found") } }}let swiftuiAudioPlayerView = SwiftUIAudioPlayerView()PlaygroundPage.current.setLiveView(swiftuiAudioPlayerView)
...or UIKit:
Code Block import AVFoundationimport SwiftUIimport PlaygroundSupportclass UIKitAudioPlayerView: UIView { /// the audio player that will play your audio file. Can't be a local variable. var audioPlayer: AVAudioPlayer? /// so we only make and connect the button once var hasLoadedView = false var audioButton = UIButton() /// the view is guarenteed to be loaded at `layoutSubviews()` override func layoutSubviews() { super.layoutSubviews() if !hasLoadedView { hasLoadedView = true audioButton.setTitle("Play Audio!", for: .normal) audioButton.setTitleColor(UIColor.blue, for: .normal) backgroundColor = .white addSubview(audioButton) /// add the button to the view audioButton.addTarget(self, action:
Replace "slow-spring-board" with the name of your sound file.
The trick here is to use Bundle.main.url(forResource:withExtension:). You MUST do this. If you try adding a file literal via the “+” button (by tapping an already-imported file), it won’t work.
- from a Medium article I'm writing on this topic (not published yet)