2016-06-11 83 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

相關問題