Cocoa 框架中有很多这样的单例范例:
// Shared URL Session
let sharedURLSession = URLSession.shared
// Default File Manager
let defaultFileManager = FileManager.default
// Standard User Defaults
let standardUserDefaults = UserDefaults.standard
// Default Payment Queue
let defaultPaymentQueue = SKPaymentQueue.default()
方案一
我们可以用 static 属性 + 访问控制来创建一个单例
class NetworkManager {
// MARK: - Properties
static let shared = NetworkManager(baseURL: API.baseURL)
// MARK: -
let baseURL: URL
// Initialization
private init(baseURL: URL) {
self.baseURL = baseURL
}
}
这样只有 NetworkManager 可以创建自己的实例化。通过 shared 这个静态常量使得外部可以访问到单例对象。
方案二
更复杂一些的实现方式,主要区别在于单例对象在一个闭包中初始化,这样可以进行更复杂的设置。
class NetworkManager {
// MARK: - Properties
private static var sharedNetworkManager: NetworkManager = {
let networkManager = NetworkManager(baseURL: API.baseURL)
// Configuration
// ...
return networkManager
}()
// MARK: -
let baseURL: URL
// Initialization
private init(baseURL: URL) {
self.baseURL = baseURL
}
// MARK: - Accessors
class func shared() -> NetworkManager {
return sharedNetworkManager
}
}
这里 static 属性被声明为私有,单例对象通过 shared() 类方法访问。
参考:https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift/