W dokumencie Apple Using Swift with Cocoa and Objective-C (zaktualizowanym dla Swift 3) podają następujący przykład wzorca Singleton:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
Wyobraźmy sobie, że ten singleton musi zarządzać zmienną tablicą ciągów. Jak / gdzie miałbym zadeklarować tę właściwość i upewnić się, że zostanie poprawnie zainicjowany w pustej [String]
tablicy?
static let shared = Singleton()
static let shared: Singleton = Singleton()
zamiast tego możesz po prostu napisaćstatic let shared = Singleton()
final class Singleton: NSObject { private override init() { } }
Możesz zainicjować pustą tablicę w ten sposób.
class Singleton { //MARK: Shared Instance static let sharedInstance : Singleton = { let instance = Singleton(array: []) return instance }() //MARK: Local Variable var emptyStringArray : [String] //MARK: Init init( array : [String]) { emptyStringArray = array } }
Lub jeśli wolisz inne podejście, to wystarczy.
class Singleton { //MARK: Shared Instance static let sharedInstance : Singleton = { let instance = Singleton() return instance }() //MARK: Local Variable var emptyStringArray : [String]? = nil //MARK: Init convenience init() { self.init(array : []) } //MARK: Init Array init( array : [String]) { emptyStringArray = array } }
źródło
extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
class var
w iOS 10 dla singletonów (np. UIApplication). Czy ich realizacja byłaby taka sama?private
nie metodyinternal
. Zapobiega to używaniu przez inne osoby domyślnego inicjatora „()” dla tej klasy.private
winit
.Zgodnie z dokumentacją Apple: w Swift możesz po prostu użyć statycznej właściwości typu, która jest leniwie inicjalizowana tylko raz, nawet gdy jest dostępna w wielu wątkach jednocześnie .
class Singleton { // MARK: - Shared static let shared = Singleton() }
Z metodą inicjalizacji:
class Singleton { // MARK: - Shared static let shared = Singleton() // MARK: - Initializer private init() { } }
źródło
Każda inicjalizacja byłaby wykonywana metodą init. Nie ma różnicy między singletonem a nie-singletonem.
źródło