Temel fark, yapı temelli değişebilen "singleton" işlevlerini yerine getirirken, sınıf tabanlı değişken tekil çalışmaların olmasıdır. Tektonunuzu değişmez yapmak istemediğiniz sürece (ki bu nadirdir) sınıf temelli olana bağlı kalmalısınız.
Yapılandırılabilir yapı temelli "singleton" un nasıl çalışmadığını gösteren bir örnek.
class MyClassSingleton {
static let sharedInstance = MyClassSingleton()
private init(){}
var state = 5
func helloClass() { print("hello from class Singleton: \(state)") }
}
struct MyStructSingleton {
static let sharedInstance = MyStructSingleton()
private init() {}
var state = 5
func helloStruct() { print("hello from struct Singleton: \(state)") }
}
Ben state
bir var
yaptı, ama ben bir salt okunur özellik artı değişen yapısıyla yöntemi olarak kalmasına neden;: Böyle her iki tekiz bir değişken eleman state
eklemeyi düşünün Esas olan, her iki türün artık değişebilir olmasıdır.
Ben csi
paylaşılan örneği başvuran çünkü bu
let csi = MyClassSingleton.sharedInstance
csi.state = 42
MyClassSingleton.sharedInstance.helloClass()
42, baskılı alır yaparsanız.
Ancak, ben ssi
tabii ki sharedInstance
bir kopyası, bizim tekil bir göstergesidir çünkü yapı tabanlı
var ssi = MyStructSingleton.sharedInstance
ssi.state = 42
MyStructSingleton.sharedInstance.helloStruct()
5 tekil yerine baskılı alır ile aynı şeyi yaptığında aslında bir singleton değil.
, 'Statik let sharedInstance' yerine 'static var sharedInstance' kullanmak, çalışmayı görünmesini sağlar. "MyStructSingleton.sharedInstance" dediğim her zaman oluşturulan yapının yeni bir kopyası mı? –
@RunningTurtle Yeni bir "MyStructSingleton" kopyası, "MyStructSingleton" türünde yeni bir değişken bildirdiğinizde oluşturulur. 'SharedInstance' öğesini atadığınızda, ikisi aynı olur, ancak aynı örnek değildir. MyStructSingleton parametresini bir parametre olarak geçirdiğinizde veya bir yöntemden döndürdüğünüzde aynı şey gerçekleşir. – dasblinkenlight