Swift'te kullanmak için uygun bir singleton modeli yapmaya çalışıyorum. Şimdiye kadar, iş parçacığı olmayan güvenli bir model olarak çalışmak mümkün:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Tekil örneğin Statik yapıya sarılması, karmaşık adlandırma şemaları olmadan tekil örneklerle çarpışmayan tek bir örneğe izin vermeli ve işleri oldukça özel yapmalıdır. Açıkçası, bu model iş parçacığı için güvenli değildir. Bu yüzden dispatch_onceher şeye eklemeye çalıştım :
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!
}
}
Ama dispatch_oncehatta derleyici hatası alıyorum :
İfadenin 'Void' türü '()' türüne dönüştürülemiyor
Sözdiziminin birkaç farklı varyantını denedim, ancak hepsi aynı sonuçlara sahip gibi görünüyor:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
dispatch_onceSwift'i kullanmanın uygun kullanımı nedir ? Başlangıçta sorun ()hata mesajı nedeniyle blok ile olduğunu düşündüm , ama ne kadar çok bakarsam, o kadar dispatch_once_tdoğru doğru tanımlanması bir sorun olabilir düşünüyorum .
@lazyiş parçacığı için güvenli olmalıdır.
Static.instance = TPScopeManager()örnek türünü zorlar. Gibi bir şey kullanırsanStatic.instance = self()Gerekli bir başlatıcı ile benzer bir , uygun tip sınıfı oluşturulur. Yine de, bu önemli bir şey, hiyerarşideki tüm örnekler için sadece bir kez! Başlatılacak ilk tür, tüm örnekler için ayarlanan türdür. Ben obj-c'nin de aynı şekilde davrandığını düşünmüyorum.