2016-06-11 14 views
3

Ich versuche, ein Benutzer-Singleton zu erstellen, das bei jeder Anmeldung oder Registrierung des Benutzers mit Benutzernamen, E-Mail-Adresse und Benutzer-ID initialisiert wird.Übergeben von Argumenten zum Initialisieren eines Singleton

Ich habe so etwas wie dies geht, aber ich bin nicht sicher, was mit dem static let sharedInstance zu tun:

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 
    } 

} 

Ich möchte die Werte aus dem Wörterbuch unter verwenden, zu verwenden, da die Parameter der initialisieren Singleton.

userInfo = ["username": "fake name", "email": "fake email", "userID": 1] 

Ab jetzt bin ich für sharedInstance einen Fehler bekommen, weil seine UserSingle() ohne die notwendigen Argumente für die initializer aufrufen. Wie komme ich dazu, da ich noch keine Benutzerdaten habe?

+1

Wo möchten Sie die Instanz tatsächlich erstellen und wie möchten Sie diesen Benutzer als aktuellen Benutzer (anstatt nur einen Benutzer) festlegen? – Wain

+0

@Wain, sobald das Wörterbuch vom Login-Prozess zurückgegeben wird, wenn ich den Benutzer Singleton erstellen möchte. Ich erstelle nicht mehrere Benutzer Singletons - Nur eine für den aktuellen Benutzer und das ist es. – Brosef

Antwort

2

Eine Möglichkeit, einen Singleton mit den gegebenen Eigenschaften zu erzeugen, ist durch Verwendung einer Funktion, die in einen Singleton mit den gefüllten Details zurück.

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 

Ich kann diese Arbeit nicht mit einem ziemlich schönen Ansatz machen wie damit. Dies wird kein Singleton sein, da bei jedem Aufruf ein neues Objekt erstellt wird.

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

Interessante Lösung. Ich werde es ausprobieren. Schnelle Frage, ist 'private init', was einen Singleton zu einem Singleton macht. Ich habe eine Version, die keinen Initialisierer hat. – Brosef

+0

@brosef '' 'static let sharedInstance = UserSingle()' '' macht einen Singleton. '' 'private init (' '' erzwingt, dass der Aufrufer Singleton verwendet, anstatt ein neues Objekt erstellen zu können. – kandelvijaya

+0

Ich sehe. Solange ich nicht versuche, neue Objekte zu erstellen, sollte es kein Problem sein ? Wenn ich jetzt die Init vollständig entferne, kann ich einen Benutzer Singleton bekommen und von allen Viewcontrollern darauf zugreifen. – Brosef

Verwandte Themen