传递参数以初始化Singleton

时间:2016-06-11 20:29:10

标签: swift singleton

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

答案 0 :(得分:2)

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

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