2016-06-17 17 views
2

sagen, dass ich ein Swift struct Setup wie dieses:Verwendet verschachtelte Initialisierer in Swift schlechte Praxis?

struct User { 
    // Properties 
    var name: String? 
    var username: String! 
    var email: String? 
} 

Nun, so wie ich es betrachten, gibt es zwei Möglichkeiten, die initializer entwerfen.

Hier ist der erste:

init(username: String) { 
    self.username = username 
} 

init(username: String, name: String) { 
    self.username = username 
    self.name = name 
} 

init(username: String, name: String, email: String) { 
    self.username = username 
    self.name = name 
    self.email = email 
} 

Hier ist das zweite:

init(username: String) { 
    self.username = username 
} 

init(username: String, name: String) { 
    self.init(username: username) 
    self.name = name 
} 

init(username: String, name: String, email: String) { 
    self.init(username: username, name: name) 
    self.email = email 
} 

Welches ist die bessere Praxis und macht es auch einen Unterschied machen?

Antwort

10

Eigentlich brauchen Sie nur ein initializer überhaupt.

username scheint erforderlich zu sein, also deklarieren Sie es als nicht optional.

Wenn Sie einen Standardwert für die anderen Parameter angeben, können diese weggelassen werden.

struct User { 
    // Properties 
    var name: String? 
    var username : String 
    var email: String? 

    init(username: String, name: String? = nil, email: String? = nil) { 
    self.username = username 
    self.name = name 
    self.email = email 
    } 
} 

Jetzt können Sie diese drei Formen mit einem Initialisierer

User(username: "Foo") 
User(username: "Foo", name: "Bar") 
User(username: "Foo", name: "Bar", email:"[email protected]") 

In diesem Fall verwenden würde ich alle Eigenschaften als Nicht-optionals zu erklären empfehlen. Das Fehlen eines Werts kann mit einer leeren Zeichenfolge dargestellt werden, und Sie müssen sich niemals mit optionalen Bindungen oder erzwungenem Auspacken befassen.

struct User { 
    // Properties 
    var name, username, email : String 

    init(username: String, name: String = "", email: String = "") { 
    ... 

Das Verhalten des initializer ist genau das gleiche

+0

Das sehr viel Sinn macht. Ich vergesse ständig, dass Standardfehler in Swift eine Rolle spielen. –

0

Dies ist nicht korrekt. Basierend auf der Apple-Dokumentation, wenn Sie mehrere Initialisierer erstellen möchten, die dasselbe tun, können Sie einen solchen Initialisierer verwenden. Convenience Initializer wird schließlich den designierten Initialisierer aufrufen.

convenience init(username: String?) { 
    self.init(username: username, name: nil) 
} 

convenience init(username: String?, name: String?) { 
    self.init(username: username, name: name, email: nil) 
} 

// designated initializer 
init(username: String?, name: String?, email: String?) { 
    self.init(username: username, name: name) 
    self.email = email 
} 

Jetzt können Sie es wie nennen dies

let user = User(username: "john") 

oder

let user = User(username: "john", name: "John Doe") 

oder

let user = User(username: "john", name: "John Doe", email: "[email protected]") 
Verwandte Themen