2015-12-02 41 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 - 它描述了您的情况