Dalam dokumen Using Swift with Cocoa dan Objective-C Apple (diperbarui untuk Swift 3) mereka memberikan contoh pola Singleton berikut:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
Mari kita bayangkan bahwa singleton ini perlu mengelola array variabel Strings. Bagaimana / di mana saya akan mendeklarasikan properti itu dan memastikannya diinisialisasi dengan benar ke [String]
array kosong ?
static let shared = Singleton()
static let shared: Singleton = Singleton()
Anda cukup menulisstatic let shared = Singleton()
final class Singleton: NSObject { private override init() { } }
Anda dapat menginisialisasi array kosong seperti ini.
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 } }
Atau jika Anda lebih suka pendekatan yang berbeda, yang ini akan baik-baik saja.
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 } }
sumber
extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
class var
iOS 10 untuk lajang (misalnya UIApplication). Apakah implementasinya akan sama dengan ini?private
metode bahkan bukaninternal
. Ini mencegah orang lain menggunakan penginisialisasi '()' default untuk kelas ini.private
diinit
.Sesuai dengan dokumentasi apple: Di Swift, Anda cukup menggunakan properti tipe statis, yang dijamin akan diinisialisasi dengan malas hanya sekali, bahkan saat diakses di beberapa utas secara bersamaan .
class Singleton { // MARK: - Shared static let shared = Singleton() }
Dengan metode inisialisasi:
class Singleton { // MARK: - Shared static let shared = Singleton() // MARK: - Initializer private init() { } }
sumber
Setiap inisialisasi akan dilakukan dengan metode init. Tidak ada perbedaan di sini antara tunggal dan bukan tunggal.
sumber