Swift sort of automatically keeps everything accessible if declared at whatever level you need it to be accessed. So if you have an object of class Audio, you just declare it at the root level outside of scenes and classes and it works like a singleton. What I do is I have my global variables in a file called globals.swift, which is part of the project. I declare those global variables there without a class structure as implicit optionals and then assign them values in GameViewController. I do the same thing with settings, where I list configuration values for my app that don't get rewritten.
Some people might do globals with a separate singleton class and settings in a property list that you fetch, but I haven't found any negative points in my system. The only problem I would recognize is that all of these properties, whether they're optionals or valued, are driven into memory when the app starts, so if there were some huge elements that aren't being used all the time, it would be more performant to only drive those into memory when needed.
Globals.swift
import SpriteKit
var audio: Audio!
GameViewController.swift
import UIKit
import SpriteKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
audio = Audio()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override var prefersStatusBarHidden : Bool {
return true
}
}