2016-04-22 21 views
17

aynı iki yaklaşım mı yoksa farkında olması orada büyük farklılıklar/tuzaklar şunlardır: elde etmek istediğinize bağlıdır ve class ve struct arasındaki farklar göre yapıyı nasıl kullanmak istediğiniziYapısal tabanlı ve Sınıf tabanlı tekil arasındaki fark nedir?

class MyClassSingleton { 
    static let sharedInstance = MyClassSingleton() 
    private init(){} 

    func helloClass() { print("hello from class Singleton") } 
} 

struct MyStructSingleton { 
    static let sharedInstance = MyStructSingleton() 
    private init() {} 

    func helloStruct() { print("hello from struct Singleton") } 
} 

cevap

30

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.

+0

, '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ı? –

+1

@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

2

. Göreceğiniz en yaygın şey, sınıfı singleton nesnesiyle kullanmaktır.

Singletons onlar sadece bir kez oluşturulur, ancak class farklı davranışlar almak ve olacaktır, hemen hemen aynı struct çünkü gelen: yapılar değer türleri ise

  • Sınıflar referans tipleri vardır
  • yapılar
  • yapılar birkaç daha ayırıcı vardır

miras olamaz basit yapıları tanımlamak için kullanılır ces ama bunun fikrini alırsın.

İlgili konular