2016-12-20 5 views
2

Was ist der Unterschied zwischen den folgenden Verwendungen? Ist da ein Unterschied?Swift - Unterschied zwischen Instanziierung auf Klassenebene und Instanziierung auf Methodenebene

class B { } 

// usage 1 
class A { 
    var b: B = B(); 
} 

// usage 2 
class A { 
    var b: B! 

    init() { 
     self.b = B() 
    } 
} 

Edit: Einige Antworten darauf hin, dass bei der Nutzung der Wert 2 nicht optional sein muss, da es einen Wert im initializer bekommt.

+1

Haben Sie die Absicht, 'b' eine optionale zu sein bei der Nutzung 2, aber nicht in der Nutzung 1? –

+0

FWIW, ich habe mich nur mit Swift beschäftigt und kenne die Antwort nicht, aber ich weiß es [macht eine Unterscheidung] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ Initialisierung.html) zwischen "Standard" -Werten und Werten, die in Initialisierern zugewiesen wurden. Ich vermute, dass es Feinheiten gibt, die in einer Vererbungshierarchie zum Tragen kommen, wenn Sie sich die Reihenfolge von Superklassen/Unterklassen-Initialisierern anschauen. Zum Beispiel kann [Java & C# anscheinend äquivalenten Initialisierungscode in entgegengesetzter Reihenfolge aufrufen] (https://chrononaut.org/2008/02/18/java-vs-c-more-fun-with-initializers/). –

+0

tat ich, aber ich sehe jetzt, dass es kein optionales sein musste. –

Antwort

3

Instanziierung erfolgt in der deklarativen Reihenfolge der Assignationsanweisungen. Aber Klassenstufe Aussagen (gespeicherten Eigenschaften) durchgeführt werden, bevor Methode Ebene Aussagen:

// in this example, the order will be C, D, B, A 
class MyClass { 
    init() { 
     b = B() 
     a = A() 
    } 

    var a: A 
    var b: B 
    var c: C = C() 
    var d: D = D() 
} 
-1

Ja, es gibt einen großen Unterschied zwischen diesen beiden. In Verwendung 2 ist b ein implicitly unwrapped optional. Wenn Sie das tun:

let a = A() 

dann a.b in beiden Fällen nicht eingestellt werden, sondern in der Nutzung 2 kann jemand dann tun:

a.b = nil 

und dann werden Sie eine Fehlermeldung erhalten, wenn Sie versuchen, zu verwenden, es.

+3

Dies scheint kein Unterschied zwischen der Initialisierung an der Deklarationsstelle gegenüber der Initialisierung in 'init()' zu sein, nur ein Unterschied in der Eigenschaftstypdeklaration. (Ich würde fast so weit gehen, zu sagen, dass es ein Tippfehler auf OP-Seite ist.) –

+0

David: Das stimmt. Der Titel der Frage und der Beispielcode waren über verschiedene Probleme, so dass ich annahm, dass der Beispielcode die Absicht der Frage war und der Titel einfach eine falsche Beschreibung war. Ich dachte, es ist einfacher, versehentlich den falschen Namen für etwas zu verwenden, als 10 Zeilen Code über etwas zu schreiben, auf das man nicht neugierig ist. :-) – WhatsUpNSDoc

0

die zusätzlichen ! in Nutzung 2 Unter der Annahme, ist nicht etwas, was Sie gemeint, nicht gibt es absolut keinen Unterschied zwischen

// usage 1 
class A { 
    var b: B = B(); 
} 

und

// usage 2 
class A { 
    var b: B 

    init() { 
     self.b = B() 
    } 
} 

Es ist genau das gleiche.

+0

Hmm. Ich wollte das implizit unwrapped optional einschließen, aber ich sehe jetzt, dass ich es nicht brauchte. Was passiert, wenn ich eine Vererbungshierarchie mit init() -Methoden habe, aber ich auch eine Variable wie in Verwendung 1 instanziiere? Erhalten die in init() initialisierten Variablen ihre Werte vor der Instanziierung auf Klassenebene oder danach? –

+0

Solange alle Ihre Variablen am Ende von init initialisiert sind, ist es nicht notwendig, sie optional zu machen, wenn Sie nicht beabsichtigen, Nil in ihnen zu speichern. – KPM

Verwandte Themen