我创建一个单一实例这样如何重置单例实例?
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