传递参数以初始化单例模式

5

我正在尝试创建一个用户单例,每次用户登录或注册时都会初始化该单例的用户名、电子邮件和用户ID。

我已经有了类似这样的东西,但我不确定该怎么处理 static let sharedInstance

class UserSingle {

    var userName: String
    var email: String
    var userID: Int
    static let sharedInstance = UserSingle()   


    private init(userName: String, email: String, userID: Int){
        self.userName = userName
        self.email = email
        self.userID = userID
    }

}

我想使用下面字典中的值作为参数来初始化单例模式。
userInfo = ["username": "fake name", "email": "fake email", "userID": 1]

目前,我在使用sharedInstance时遇到了错误,因为它在没有必要的初始化参数的情况下调用了UserSingle()。由于我还没有用户数据,该如何解决这个问题呢?


1
你实际上想在哪里创建实例,并且你想如何将该用户设置为当前用户(而不仅仅是一个用户)? - Wain
@Wain,一旦从登录过程返回字典,我就想创建用户单例。我不会创建多个用户单例 - 只为当前用户创建一个。 - Brosef
1个回答

3

创建具有给定属性的单例的一种方法是使用一个函数,该函数将返回填充了详细信息的单例。

class UserSingle {

        var userName: String
        var email: String
        var userID: Int
        static let sharedInstance = UserSingle()

        private static func sharedInstanceWith(userName:String, email:String, userID: Int) -> UserSingle {
            let instance = UserSingle.sharedInstance
            instance.userName = userName
            instance.email = email
            instance.userID = userID
            return instance
        }

        private init(userName: String = "" , email: String = "", userID: Int = 0){
            self.userName = userName
            self.email = email
            self.userID = userID
        }

    }

    let user1 = UserSingle.sharedInstance
    let user2 = UserSingle.sharedInstanceWith("BJ", email: "xyz@gmail.com", userID: 12)
    user1.userID  //12

我不能用以下的一种非常优美的方式来实现这个。每次调用sharedInstance都会创建一个新对象,因此它实际上不是一个单例。

static let sharedInstance: (String, String, Int) -> UserSingle = {
    name, email , id in
    return UserSingle(userName: name, email: email, userID: id)
}

有趣的解决方案。我会试一下。快问一句,private init 是什么让单例成为单例的呢?我有一个版本可以工作,但没有初始化器。 - Brosef
@brosef static let sharedInstance=UserSingle() 是创建单例的关键。private init( 强制调用者使用 Singleton 而不是允许创建新对象。 - kandelvijaya
我明白了。只要我不尝试创建新的对象,那么就不应该有问题,对吧?目前来看,如果我完全删除init,我可以获得一个用户单例并从所有视图控制器中访问它。 - Brosef
你懂了。@Brosef - kandelvijaya
@kandelvijaya:正如你所说,这不是一个单例。 - Luca Angeletti
我认为这不会起作用。私有的sharedInstanceWith函数无法从类外部调用。 - Adrian Bartholomew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接