2016-04-22 12 views
17

は同じ2つのアプローチはありますか注意すべきそこに大きな違い/落とし穴です:あなたが達成したいかに依存し、あなたがclassstructとの違いに基づいて構造を使用する方法をStructベースのクラスとクラスベースのシングルトンの違いは何ですか?

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") } 
} 

答えて

30

主な違いは、そのクラスベースの可変シングルトン作品です。シングルトンを不変(稀である)にしたいのでない限り、クラスベースのものに固執する必要があります。

ここでは、可変構造体ベースの "シングルトン"がどのように機能しないかを示します。このように、両方のシングルトンに変更可能なメンバーstateを追加することを検討してください:

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)") } 
} 

私はstatevarを作ったが、私は読み取り専用のプロパティを加えた変異の方法として、それを公開することができ、本質的なことは、両方のタイプが現在変更可能であるということです。

私はこの

let csi = MyClassSingleton.sharedInstance 
csi.state = 42 
MyClassSingleton.sharedInstance.helloClass() 

42を行う場合csiが共有インスタンスを参照しているので、印刷します。私は構造体ベースのシングルトン

var ssi = MyStructSingleton.sharedInstance 
ssi.state = 42 
MyStructSingleton.sharedInstance.helloStruct() 

5と同じことを行うときssiはもちろん、あるsharedInstanceのコピー、私たちのシングルトンがあることを示しているので、しかし、代わりに印刷されます

実際にはシングルトンではありません。

+0

興味深いことに、代わりに '静的VARのsharedInstance'を使用して'静的sharedInstance'は、動作するように見えますしましょう。 'MyStructSingleton.sharedInstance'を呼び出すたびに新しい構造体のコピーが生成されますか?あなたは 'MyStructSingleton'型の新しい変数を宣言するときMyStructSingleton''の新しいコピーが作成され@RunningTurtle –

+1

。 'sharedInstance'を割り当てたら、2つは同じになりますが、同じインスタンスではありません。あなたは、パラメータとして 'MyStructSingleton'を渡したり、メソッドからそれを返すときも同じことが起こります。 – dasblinkenlight

2

。最もよく見られることは、シングルトンオブジェクトでクラスを使用することです。構造体は値型

  • ありながらクラスは、参照型です

    • シングルトンがほとんど同じであるため、それらは一度だけ作成されますが、classからとstructから異なる動作を取得します構造体は

    • 構造体は、さらにいくつかのdifferenあり

    継承することはできません

  • 、単純な構造を定義するために使用されていますあなたはこれからアイデアを得る。構造体ベースの可変「シングルトン」はそうではない

    関連する問題