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
    }
}