Saya mencoba mencari model tunggal yang sesuai untuk digunakan di Swift. Sejauh ini, saya sudah bisa mendapatkan model aman non-utas bekerja sebagai:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Membungkus instance singleton dalam Static struct harus memungkinkan satu instance yang tidak bertabrakan dengan instance singleton tanpa skema penamaan yang rumit, dan itu harus membuat semuanya menjadi sangat pribadi. Namun jelas, model ini tidak aman untuk thread. Jadi saya mencoba menambahkan dispatch_once
semuanya:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
static var token: dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
Tapi saya mendapatkan kesalahan kompiler di dispatch_once
telepon:
Tidak dapat mengonversi jenis ekspresi 'Void' ke mengetik '()'
Saya sudah mencoba beberapa varian sintaks yang berbeda, tetapi semuanya tampaknya memiliki hasil yang sama:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Apa penggunaan yang tepat dispatch_once
menggunakan Swift? Saya awalnya berpikir masalahnya adalah dengan blok karena ()
dalam pesan kesalahan, tetapi semakin saya melihatnya, semakin saya pikir itu mungkin masalah untuk mendapatkan dispatch_once_t
definisi yang benar.
@lazy
harus aman.
Static.instance = TPScopeManager()
memaksa tipe instance. Jika Anda menggunakan sesuatu seperti Static.instance = self()
dengan inisialisasi yang diperlukan, kelas tipe yang sesuai akan dihasilkan. Meski begitu, dan ini adalah hal penting yang perlu diperhatikan, hanya sekali untuk semua instance dalam hierarki! Jenis pertama yang diinisialisasi adalah jenis yang ditetapkan untuk semua instance. Saya tidak berpikir objektif-c berperilaku sama.