iOS swift 4 将默认布尔值设置为复杂的静态变量?

iOS swift 4 sets a default boolean to complicated static variables?

您好,我正在开发一个连接到 Web API 并包含本地数据库(领域)的应用程序。 我有一个 User class 这是一个 Realm Object subclass 并保持用户信息这样作为 usernamepasswordaccessToken 等。它还有一个 静态变量并计算 属性 称为 instance: User?current: User? 请在下面找到详细信息

class User: Object {

    /// Properties (Database Columns)
    @objc dynamic var username: String = ""
    @objc dynamic var password: String = ""
    @objc dynamic var accessToken: String = ""

    /// Current Logged In User
    static var current: User? {
        if instance == nil {
            let realm = try! Realm()
            instance = realm.objects(self).first
        }

        return instance
    }

    private static var instance: User?
}

如你所见current 属性 returns realm数据库的第一个User实例如果有的话就是登录用户信息,否则returns nil表示用户尚未登录应用。

我还有另一个class叫Configs它的名字可以描述它的作用,里面有一个静态布尔变量叫做isLogin。这是我定义的代码部分

static var isLogin: Bool = User.current != nil

如您所见,属性 指的是上述 User.current 属性 和 returns 结果。 每当我想检查用户是否登录时,我都会在应用程序中多次调用 Configs.isLogin,这样我就可以告诉应用程序正常运行。 但是当我调用这个 属性 时,它似乎 swift 潜入 属性 并在应用程序会话中调用 User.current JUST ONCE,下一次它只保留第一个结果并将其直接分配给 Configs.isLogin 并且它将不再检查 User.current 属性 并且不会运行查询以查看是否有任何结果或不是,因此例如当用户填写并提交注册表并从 API 获取令牌并且我将信息保存在 Realm 中时,如果我调用 Configs.isLogin 它仍然 returns false 因为在此会话中它第一次检查 User.current 它是零,但如果我直接调用 User.current (在注册后)它不再是零并且我可以访问登录用户,如果我重新启动应用程序并开始一个新的应用程序会话 Configs.isLogin returns true 这是正确的并显示 swift 潜入 User.current 并检查它并返回正确的结果(正如我提到的在本文的开头,只有第一次它会深入 class 并检查结果。

我调试了我的应用程序和几个部分,直到我发现这个问题,我怎样才能让 swift 总是从 Config.isLogin 属性 潜入 User.current 当我叫这个配置?我的代码有问题吗?如果是的话,正确的方法是什么?谢谢

目前isLogin是一个在第一次访问时初始化的变量。您可以将初始化部分移动到计算的 属性 中,以便它始终检查 User.current:

static var isLogin: Bool { return User.current != nil }

Here 您可以阅读计算属性。