2015-12-02 16 views
5

は、私はこのインスタンスをリセットしたり、背中をnilに設定することができますどのようにこのシングルトンインスタンスをリセットするには?

static let currentUser = User() 

private override init() { 
    super.init() 
    // custom initialisation 
} 

などのシングルトンインスタンスを作成していますか?

+1

初期状態を再現するメソッドを追加します。 – dasdom

答えて

18

を私はしかし、私はまた、このを作るoptionalシングルトンインスタンス とすべての私のシングルトンを作成します。を取得し、関数を使用して取得します。 シングルトンがnilの場合、新しいインスタンスが作成されます。

これは、実際にはシングルトンを設定する唯一の良い方法です。初期化できない通常のオブジェクトがある場合は、メモリの問題です。シングルトンはそれを行うための関数を書く必要があることを除いて、違いはありません。

シングルトンは完全に自己管理する必要があります。これは、initからdeinitまでを意味します。

Singeltonsにはgithubという2つのテンプレートがあり、そのうちの1つは完全に実装された読み取り/書き込みロックがあります。

class Singleton { 

    private static var privateShared : Singleton? 

    class func shared() -> Singleton { // change class to final to prevent override 
     guard let uwShared = privateShared else { 
      privateShared = Singleton() 
      return privateShared! 
     } 
     return uwShared 
    } 

    class func destroy() { 
     privateShared = nil 
    } 

    private init() { 
     print("init singleton") 
    } 

    deinit { 
     print("deinit singleton") 
    } 
} 
+0

@R Menke Githubでの実装はSwift 3互換ではありません – JAHelia

+1

@JAHelia私はSwiftコードの更新をあきらめて以来、長い間待っています。 Appleがすべてを壊し続けているので、私はSwift alを一緒に書くことをやめた。 –

5

currentUserletと宣言した場合は、これを実行できません。代わりにvarである必要があります。より良い場合はprivate (set) varです。また、そのタイプがUser(現時点での割り当て方法から推測されている)の場合はcurrentUsernilを割り当てることはできません。代わりに、User?にする必要があります。

例えば、このような何か:

/// ... 

static private (set) var currentUser: User? = User() 

static func resetCurrentUser() { 
    currentUser = nil 
} 

// ... 

private (set)は、現在のファイルのスコープ内のプロパティの変更を可能にし、あなたのコードの残りのためにそれはletとして見られます。その後、方法resetCurrentUser()を使用して、nilにすることができます。


あるいはこの:

// ... 

private static var _currentUser: User? 

static var currentUser: User { 
    if _currentUser == nil { _currentUser = User() } 
    return _currentUser! 
} 

static func resetCurrentUser() { 
    _currentUser = nil 
} 

// ... 

あなたは値を返すために保証計算プロパティとしてcurrentUserを持つことができます。したがって、ユーザーをnilにリセットすることができます。しかし、後でそこから再度読み込もうとすると、新しいインスタンスが自動的に作成されます。

ただし、マルチスレッドアクセスには注意してください。

1

あなたが望むものはすべて可能ですが、非常に推奨されません:)設計上のシングルトンはゼロに戻ってはならないためです。

currentUserを変更する場合は、最初にvarに変更する必要があります。それからあなたがそれがゼロであることを望むならば、それはオプションのタイプでなければならず、使用するときにそれをアンラッピングするべきです。私は、例えば(一部UsersManagerのプロパティをcurrentUserを変更したり、非静的作らないに提案する

static var currentUser: User? = User() 

また、あなたはcurrentUser(のようなnameloggedIn)のプロパティを変更することができます。最後に、この答えを見て取る:https://stackoverflow.com/a/28398974/326017を - それはあなたの状況を説明し

関連する問題