Swift - 如何将单例设置为 nil
Swift - How to set a singleton to nil
我正在 swift 中编写一个应用程序,并使用单例在整个应用程序中共享一个 class 对象 User。
我希望能够在用户注销时将此单例设置为 'nil',以便当他们重新登录时旧属性不再存在(即名称、用户名等)。
我希望有一种简单的方法可以将单例设置回 nil,而不必将每个 属性 设置为 nil。
这是我的用户 class,在应用程序中用作 User.activeUser:
class User: NSObject
{
class var activeUser : User? {
struct Static {
static let instance : User = User()
}
return Static.instance
}
}
我怎样才能改变它,使下面的代码不给我一个警告并实际上消除单例对象:
User.activeUser = nil
这应该有效:
private var _SingletonSharedInstance:MyClass! = MyClass()
class MyClass {
let prop = "test"
class var sharedInstance : MyClass {
return _SingletonSharedInstance
}
init () {}
func destroy() {
_SingletonSharedInstance = nil
}
}
但是对象的引用仍然保留,所以你需要做一些额外的事情来使 class 中的方法调用无效。
您的 activeUser 设置为只读计算 属性。每次您调用 User.activeUser 时,它都会为您重新计算 activeUser。为了将它设置为 nil,您必须添加一些逻辑来确定用户是否在计算 属性 之外登录。像这样的东西会起作用:
class User: NSObject
{
private struct userStatus { static var isLoggedIn: Bool = true }
class var activeUser : User? {
get {
if userStatus.isLoggedIn {
struct Static {
static let instance : User = User()
}
return Static.instance
} else {
return nil
}
}
set(newUser) {
if newUser != nil {
userStatus.isLoggedIn = true
} else {
userStatus.isLoggedIn = false
}
}
}
}
这里有一个我在 java 中使用的解决方案,但也适用于 swift:
class Manager {
private static var manager: Manager?
static func instance() -> Manager {
if Manager.manager == nil {
Manager.manager = Manager()
}
return Manager.manager!
}
func destroy() {
Manager.manager = nil
}
}
我正在 swift 中编写一个应用程序,并使用单例在整个应用程序中共享一个 class 对象 User。 我希望能够在用户注销时将此单例设置为 'nil',以便当他们重新登录时旧属性不再存在(即名称、用户名等)。 我希望有一种简单的方法可以将单例设置回 nil,而不必将每个 属性 设置为 nil。
这是我的用户 class,在应用程序中用作 User.activeUser:
class User: NSObject
{
class var activeUser : User? {
struct Static {
static let instance : User = User()
}
return Static.instance
}
}
我怎样才能改变它,使下面的代码不给我一个警告并实际上消除单例对象:
User.activeUser = nil
这应该有效:
private var _SingletonSharedInstance:MyClass! = MyClass()
class MyClass {
let prop = "test"
class var sharedInstance : MyClass {
return _SingletonSharedInstance
}
init () {}
func destroy() {
_SingletonSharedInstance = nil
}
}
但是对象的引用仍然保留,所以你需要做一些额外的事情来使 class 中的方法调用无效。
您的 activeUser 设置为只读计算 属性。每次您调用 User.activeUser 时,它都会为您重新计算 activeUser。为了将它设置为 nil,您必须添加一些逻辑来确定用户是否在计算 属性 之外登录。像这样的东西会起作用:
class User: NSObject
{
private struct userStatus { static var isLoggedIn: Bool = true }
class var activeUser : User? {
get {
if userStatus.isLoggedIn {
struct Static {
static let instance : User = User()
}
return Static.instance
} else {
return nil
}
}
set(newUser) {
if newUser != nil {
userStatus.isLoggedIn = true
} else {
userStatus.isLoggedIn = false
}
}
}
}
这里有一个我在 java 中使用的解决方案,但也适用于 swift:
class Manager {
private static var manager: Manager?
static func instance() -> Manager {
if Manager.manager == nil {
Manager.manager = Manager()
}
return Manager.manager!
}
func destroy() {
Manager.manager = nil
}
}