2016-11-07 5 views
4

Ich habe eine Frage über Variablen Initialisierung in Swift.Swift Variablen Initialisierung

Ich habe zwei Möglichkeiten, eine Variable zu initialisieren (als "Eigenschaft" einer Klasse in Objective-C).

Welche von ihnen ist am richtigsten?

class Class { 

    var label: UILabel! 

    init() { ... label = UILabel() ... } 

} 

oder

class Class { 

    var label = UILabel() 

    init() { … } 

} 
+0

Es ist nicht eine Frage der Korrektheit. Es ist eher eine Frage von Anforderungen und Code-Styling. Wenn der Wert von "Label" berechnet wird, verwenden Sie die erste Variante. Wenn der Wert wie eine Konstante ist, tendieren Sie zur zweiten Variante (und verwenden wahrscheinlich "let" anstelle von "var"). Aber die Ausnahme beweist die Regel. ;) – clemens

+0

@macmoonshine Ich hatte Angst, dass der zweite eine Art falscher Weg ist, dies zu tun. Danke, jetzt sehe ich :) –

Antwort

15

Tatsächlich haben Sie 5 Möglichkeiten, Eigenschaften zu initialisieren.

Es gibt keinen richtigen Weg, der Weg hängt von den Bedürfnissen ab.
Grundsätzlich Objekte wie UILabel immer - wenn möglich - als Konstante deklarieren (let).

Die 5 Wege sind:

  • Initialisierung in der Deklarationszeile

    let label = UILabel(frame:... 
    
  • Initialisierung im init Methode, Sie müssen nicht die Eigenschaft als implizite ungeöffneten optional deklarieren.

    let label: UILabel 
    init() { ... label = UILabel(frame:...) ... } 
    

Die ersten beiden Möglichkeiten sind praktisch identisch.

  • Initialisierung bei einem Verfahren wie viewDidLoad, in diesem Fall, dass Sie die Eigenschaft als (implizite ungeöffneten) optional und auch als var

    var label: UILabel! 
    
    on viewDidLoad() 
    ... 
    label = UILabel(frame:...) 
    } 
    
  • Initialisierung mit einem Verschluss zu erklären, haben eine Standard zuweisen (berechneter) Wert. Der Abschluss wird einmal aufgerufen, wenn die Klasse initialisiert wird und es nicht möglich ist, andere Eigenschaften der Klasse im Abschluss zu verwenden.

    let label: UILabel = { 
        let lbl = UILabel(frame:...) 
        lbl.text = "Foo" 
        return lbl 
    }() 
    
  • Lazy Initialisierung mit einem Verschluss. Die Schließung wird (einmal) aufgerufen, wenn auf die Eigenschaft das erste Mal zugegriffen wird, und Sie können andere Eigenschaften der Klasse verwenden.
    Die Eigenschaft muss als var

    let labelText = "Bar" 
    
    lazy var label: UILabel = { 
        let lbl = UILabel(frame:...) 
        lbl.text = "Foo" + self.labelText 
        return lbl 
    }() 
    
+0

'label: UILabel (frame: ...' <- sollte es nicht '=' anstelle von ':'? – user28434

+0

Richtig, danke @ user28434 – vadian

+0

Vielen Dank für diese großartige Antwort!) @Vadian –

0

Beide Wege sind richtig, aber manchmal sollten Sie die Initialisierung in init() Methode verwenden. Zum Beispiel wird hier der target für barButton nicht gesetzt, weil self noch nicht existiert.

class Foo { 
    var barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod)) 

    init(){ 
     //init here 
    } 
} 

Der richtige Weg für diesen Fall ist:

class Foo { 
    var barButton : UIBarButton? 

    init(){ 
     barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod)) 
    } 
} 

Um es zusammenzufassen, beide Wege sind richtig, aber man muss berücksichtigen, wenn jeder zu verwenden. Weitere Informationen darüber unter Apple documentation

Verwandte Themen