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 AVFoundation |
| import SwiftUI |
| import PlaygroundSupport |
|
| struct 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 AVFoundation |
| import SwiftUI |
| import PlaygroundSupport |
|
| class 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: #selector(playAudio), for: .touchUpInside) |
| } |
| |
| /// positioning (center-align the button) |
| let middleXOfView = bounds.width / 2 |
| let middleYOfView = bounds.height / 2 |
| let buttonFrame = CGRect(x: middleXOfView - 60, y: middleYOfView - 20, width: 120, height: 40) |
| audioButton.frame = buttonFrame |
| } |
| |
| @objc 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 uikitAudioPlayerView = UIKitAudioPlayerView() |
| PlaygroundPage.current.setLiveView(uikitAudioPlayerView) |
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)