我創建一個單一實例這樣如何重置單例實例?
static let currentUser = User()
private override init() {
super.init()
// custom initialisation
}
如何重置這個實例或重新設置爲零?
我創建一個單一實例這樣如何重置單例實例?
static let currentUser = User()
private override init() {
super.init()
// custom initialisation
}
如何重置這個實例或重新設置爲零?
創建我有optional
Singleton實例 所有單身不過,我也讓這款。並使用函數來獲取它。 如果單例是nil
它創建一個新的實例。
這實際上是設置Singleton的唯一好方法。如果你有一個常規的對象,你不能去初始化它是一個內存問題。單身人士是沒有什麼不同,除了你必須寫一個功能來做到這一點。
單身人士必須完全自我管理。這意味着從init到deinit。
對於Singeltons,我有幾個模板github,其中一個具有完全實現的讀/寫鎖定。
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在Github中實現你的實現不是Swift 3兼容 – JAHelia
@JAHelia我早就放棄了更新Swift代碼。我甚至不再一起寫Swift al,因爲Apple一直在打破一切。 –
如果您聲明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
。然後,如果您希望它爲零,則必須使用可選類型,並且在使用時應將其解開。
static var currentUser: User? = User()
我提議不會改變currentUser
或使其成爲非靜態的(例如,一些UsersManager
屬性。
您也可以更改(如name
,loggedIn
)的currentUser
性能。最後,看看這個答案:https://stackoverflow.com/a/28398974/326017 - 它描述了您的情況
添加一個重新創建初始狀態的方法。 – dasdom