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_once
her ş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_once
hatta 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_once
Swift'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_t
doğru doğru tanımlanması bir sorun olabilir düşünüyorum .
@lazy
iş 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.