2015-12-02 40 views
5

我創建一個單一實例這樣如何重置單例實例?

static let currentUser = User() 

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

如何重置這個實例或重新設置爲零?

+1

添加一個重新創建初始狀態的方法。 – dasdom

回答

18

創建我有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") 
    } 
} 
+0

@R在Github中實現你的實現不是Swift 3兼容 – JAHelia

+1

@JAHelia我早就放棄了更新Swift代碼。我甚至不再一起寫Swift al,因爲Apple一直在打破一切。 –

5

如果您聲明currentUserlet,則不能這樣做。應該是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,是的。但如果稍後您將嘗試從那裏再次讀取,則會自動創建一個新實例。

但是,請注意多線程訪問。

1

所有你想要的都是可能的,但高度推薦:)因爲設計中的單身人士不應該回落到零。

首先,如果你想改變currentUser,它必須是var。然後,如果您希望它爲零,則必須使用可選類型,並且在使用時應將其解開。

static var currentUser: User? = User() 

我提議不會改變currentUser或使其成爲非靜態的(例如,一些UsersManager屬性。

您也可以更改(如nameloggedIn)的currentUser性能。最後,看看這個答案:https://stackoverflow.com/a/28398974/326017 - 它描述了您的情況