は、私はこのインスタンスをリセットしたり、背中をnilに設定することができますどのようにこのシングルトンインスタンスをリセットするには?
static let currentUser = User()
private override init() {
super.init()
// custom initialisation
}
などのシングルトンインスタンスを作成していますか?
は、私はこのインスタンスをリセットしたり、背中をnilに設定することができますどのようにこのシングルトンインスタンスをリセットするには?
static let currentUser = User()
private override init() {
super.init()
// custom initialisation
}
などのシングルトンインスタンスを作成していますか?
を私はしかし、私はまた、このを作る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")
}
}
@R Menke Githubでの実装はSwift 3互換ではありません – JAHelia
@JAHelia私はSwiftコードの更新をあきらめて以来、長い間待っています。 Appleがすべてを壊し続けているので、私はSwift alを一緒に書くことをやめた。 –
currentUser
をlet
と宣言した場合は、これを実行できません。代わりにvar
である必要があります。より良い場合はprivate (set) var
です。また、そのタイプがUser
(現時点での割り当て方法から推測されている)の場合はcurrentUser
にnil
を割り当てることはできません。代わりに、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
にリセットすることができます。しかし、後でそこから再度読み込もうとすると、新しいインスタンスが自動的に作成されます。
ただし、マルチスレッドアクセスには注意してください。
あなたが望むものはすべて可能ですが、非常に推奨されません:)設計上のシングルトンはゼロに戻ってはならないためです。
currentUser
を変更する場合は、最初にvar
に変更する必要があります。それからあなたがそれがゼロであることを望むならば、それはオプションのタイプでなければならず、使用するときにそれをアンラッピングするべきです。私は、例えば(一部UsersManager
のプロパティをcurrentUser
を変更したり、非静的作らないに提案する
static var currentUser: User? = User()
。
また、あなたはcurrentUser
(のようなname
、loggedIn
)のプロパティを変更することができます。最後に、この答えを見て取る:https://stackoverflow.com/a/28398974/326017を - それはあなたの状況を説明し
初期状態を再現するメソッドを追加します。 – dasdom