2016-06-11 120 views
3

我试图创建一个用户单例,每次用户登录或注册时都会使用用户名,电子邮件和用户标识进行初始化。传递参数来初始化Singleton

我有这样的事情去,但我不知道该怎么做与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

+0

@一旦字典从登录过程返回,我就想创建用户单例。我没有创建多个用户单例 - 只有一个用于当前用户,多数民众赞成它。 – Brosef

回答

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: "[email protected]", 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) 
} 
+0

有趣的解决方案。我会尝试一下。问题很简单,是'private init'是什么使单身人士成为一个单身人士。我有一个没有初始化的版本。 – Brosef

+0

@brosef''static let sharedInstance = UserSingle()'''是什么使单身。 '''私有init('''强制调用者使用Singleton而不是允许创建一个新对象 – kandelvijaya

+0

我明白了,只要我不尝试创建新对象,那么它不应该是一个问题?截至目前,如果我完全删除init,我可以得到一个用户singleton并从所有viewcontrollers访问它。 – Brosef