2015-04-16 6 views
20

Ich habe eine einfache Klasse wie diese.Rückkehr vom Initialisierer ohne Initialisierung aller gespeicherten Eigenschaften

public class User { 
    let id: Int 
    let firstName: String 
    let lastName: String 
    let email: String? 

    init(id: Int, firstName: String, lastName: String) { 
     self.id = id 
     self.firstName = firstName 
     self.lastName = lastName 
    } 
} 

Dies kompiliert gut in früheren Swift-Version. In Swift 1.2 erhalte ich den folgenden Kompilierungsfehler.

Rückkehr aus initializer ohne dass die gespeicherten Eigenschaften zu initialisieren

Warum ist das so und wie kann ich es beheben?

Antwort

27

Wenn eine Eigenschaft konstant ist, so mit let erstellt, müssen Sie es an seinem Platz initialisieren oder im init Verfahren, auch wenn es ein Optional ist. Wenn Sie die E-Mail optional einstellen möchten, sollten Sie let in var ändern. Mit anderen Worten, wenn Sie eine Variable weder in der Init-Methode noch im Klassenhauptteil initialisieren, muss die Variable sowohl eine var als auch eine Optional sein.

ähnliche Aussagen im docs:

Sie Wert auf eine konstante Eigenschaft zu jedem Zeitpunkt während der Initialisierung wird, solange es auf einen bestimmten Wert durch die Zeit der Initialisierung beendet gesetzt zuweisen können. Sobald einer konstanten Eigenschaft ein Wert zugewiesen wurde, kann sie nicht weiter geändert werden.

Für Klasseninstanzen kann eine konstante Eigenschaft nur während der Initialisierung von der Klasse geändert werden, die sie einführt. Es kann nicht von einer Unterklasse geändert werden.

+1

Es spielt keine Rolle, ob Sie 'let' oder' var' verwenden. Sie müssen es im Initialisierer setzen, um diesen Kompilierungsfehler zu vermeiden. Ich hatte denselben Fehler, ohne irgendwelche 'Let'-Variablen zu verwenden, und dieser Fehler erschien ebenfalls. Also musste ich diese Variablen entfernen oder einrichten, um diesen Kompilierungsfehler zu vermeiden. – Jurik

+0

@Jurik bei ‚Optional ist, ist es egal, sonst ist es wahr, was Sie gesagt. –

+0

@ DánielNagy die Art und Weise Ihrer Antwort formuliert wird, ist ein wenig irreführend, weil auf einem schnellen lesen, wäre es ein vorgaukeln zu var zu ändern lassen, würde den Fehler beheben. In Wirklichkeit gibt es zwei Dinge, die benötigt werden: Ändern 1) bis var lassen, und 2) Mit optionals – VKK

1

Zunächst muss klargestellt werden, dass jede Variable let zum Deklarationszeitpunkt einen Wert erhalten muss. So werden Ihre Aussagen

let id: Int = 0 
let firstName: String = "test" 
let lastName: String = "Test" 
let email: String? = "Test" 

sein Zweitens in Klassen, müssen Sie Variablen initialisieren müssen oder definieren sie als Sondertypen entweder durch setzen ‚?‘ oder '!' mit jeder Variable. Wie

let id: Int! 
let firstName: String! 
let lastName: String! 
let email: String? 

oder

let id: Int? 
let firstName: String? 
let lastName: String? 
let email: String? 

Aber wollen Sie hier sagen, dass diese Variablen nicht in der Lage sein, zu ändern, da sie Konstanten sind. Sie müssen also var mit diesen Werten verwenden, wenn Sie den Wert zum Zeitpunkt der Deklaration nicht übergeben. Ihr endgültiger Code in diesem Fall ist eine Art dieser

11

Sie müssen explizit einen Wert für E-Mail festlegen, da es eine Konstante ist.

Oder wie die anderen erwähnten können Sie E-Mail in eine Variable ändern.

+0

Ja, die obige Antwort ist korrekt. –

3

Ändern Sie die E-Mail von "let" zu "var" wie folgt.

public class User { 
    let id: Int 
    let firstName: String 
    let lastName: String 
    var email: String? 

    init(id: Int, firstName: String, lastName: String) { 
     self.id = id 
     self.firstName = firstName 
     self.lastName = lastName 

    } 
} 
13

Die Faustregel:

  • Wenn Sie lassen haben, müssen Sie es initialisiert werden (auch wenn es optional ist).ZB: let email: String
  • Wenn Sie einen nicht optional var haben Sie initialisieren müssen. ZB var email: String
  • Wenn Sie eine optionale var haben brauchen Sie nicht es zu initialisieren. ZB var email: String?
Verwandte Themen