传递参数来初始化单例

Bro*_*sef 5 singleton swift

我正在尝试创建一个用户单例,每次用户登录或注册时都会使用用户用户名、电子邮件和用户 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
    }

}
Run Code Online (Sandbox Code Playgroud)

我想使用下面字典中的值作为参数来初始化单例。

userInfo = ["username": "fake name", "email": "fake email", "userID": 1]
Run Code Online (Sandbox Code Playgroud)

截至目前,我收到一个错误,sharedInstance因为它的调用UserSingle()没有初始化程序的必要参数。由于我还没有用户数据,如何解决这个问题?

kan*_*aya 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
Run Code Online (Sandbox Code Playgroud)

我无法用这样一个相当漂亮的方法来完成这项工作。这实际上不会是单例,因为每次sharedInstance调用都会创建一个新对象。

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