主な違いは、そのクラスベースの可変シングルトン作品です。シングルトンを不変(稀である)にしたいのでない限り、クラスベースのものに固執する必要があります。
ここでは、可変構造体ベースの "シングルトン"がどのように機能しないかを示します。このように、両方のシングルトンに変更可能なメンバー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)") }
}
私はstate
var
を作ったが、私は読み取り専用のプロパティを加えた変異の方法として、それを公開することができ、本質的なことは、両方のタイプが現在変更可能であるということです。
私はこの
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
のコピー、私たちのシングルトンがあることを示しているので、しかし、代わりに印刷されます
実際にはシングルトンではありません。
興味深いことに、代わりに '静的VARのsharedInstance'を使用して'静的sharedInstance'は、動作するように見えますしましょう。 'MyStructSingleton.sharedInstance'を呼び出すたびに新しい構造体のコピーが生成されますか?あなたは 'MyStructSingleton'型の新しい変数を宣言するときMyStructSingleton''の新しいコピーが作成され@RunningTurtle –
。 'sharedInstance'を割り当てたら、2つは同じになりますが、同じインスタンスではありません。あなたは、パラメータとして 'MyStructSingleton'を渡したり、メソッドからそれを返すときも同じことが起こります。 – dasblinkenlight