Hier ist ein Zitat aus der Dokumentation:
Wenn Ihr benutzerdefinierter Typ eine gespeicherte Eigenschaft hat, die logisch "keinen Wert" haben darf - weil der Wert möglicherweise nicht während der Initialisierung festgelegt werden kann oder weil zu einem späteren Zeitpunkt "kein Wert" zulässig ist - deklarieren Sie die Eigenschaft mit einem optionalen Typ. Eigenschaften des optionalen Typs werden automatisch mit dem Wert nil initialisiert, was darauf hinweist, dass die Eigenschaft während der Initialisierung bewusst "noch kein Wert" haben soll.
Wenn ich das mit einer Klasse mache, funktioniert es gut:
%Vor%Wenn ich dies jedoch mit einem Strukturtyp mache, erhalte ich bei der Initialisierung einen Fehler:
%Vor%Fehler:
Fehlendes Argument für Parameter 'someProperty'
Ich kann Abhilfe schaffen, indem ich es explizit so deklariere:
%Vor%Angesichts der Dokumentation würde ich erwarten, dass Eigenschaften von jedem Typ, die als Optionals festgelegt sind, standardmäßig auf Null gesetzt werden. Gibt es einen Grund, dass ich es explizit auf einer Struktur deklarieren muss?
Warum?
Kein guter Grund, wie viele von euch experimentiere ich nur.
Für beide Klassen und Strukturen müssen alle Eigenschaftswerte bei der Initialisierung festgelegt werden. Dies kann entweder über explizite Standardwerte oder durch Festlegen eines Werts im angegebenen Initialisierer erfolgen.
Structs unterscheiden sich jedoch in der Tatsache, dass sie einen automatisch erzeugten memberwise Initialisierer haben.
Wenn Sie für someProperty
keinen Wert explizit definieren, hat Ihre Struktur nur einen Initialisierer: den automatisch generierten memberwise.
Wenn Sie einen Standardwert angeben, erhalten Sie zwei: einen, der keine Argumente annimmt, und einen, der einen Wert für someProperty
als Argument annimmt
Aus der Dokumentation:
%Vor%Alle Strukturen haben einen automatisch generierten memberwise Initializer, mit dem Sie die Elementeigenschaften der neuen Struktur initialisieren können Instanzen. Anfangswerte für die Eigenschaften der neuen Instanz können an den Memberwise-Initialisierer mit dem Namen übergeben werden:
Im Gegensatz zu Strukturen erhalten Klasseninstanzen memberwise nicht standardmäßig Initialisierer. Initialisierer werden in näher beschrieben Initialisierung.
Ich stimme zu, das ist ziemlich skurril (es sei denn, ich vermisse auch etwas). Für Strukturen mit only -Optionen kann es sich (über Apple bugreport) empfehlen, in solchen Fällen standardmäßig auch einen standardmäßigen parameterlosen Initialisierer hinzuzufügen?
Ein anderes Mittel ist
%Vor%Allerdings, wenn Sie viele optionale Mitglieder hatten, wird dies klobig.
Ich denke, das ist ein bewusster Unterschied zwischen Strukturen und Klassen, was ein wenig sinnvoll ist. Zum Beispiel, wenn Sie eine Struktur haben, sagen Sie einen 3D-Punkt mit drei Floats für XYZ. Es macht wenig Sinn, einen Nullwert für x oder y oder z zu haben. Mit einer Klasse ist das ein sehr wichtiges Feature. Wenn Sie beispielsweise an eine Downloader-Klasse denken, geht das und lädt eine Textdatei herunter und speichert sie in einer Eigenschaft. Es macht mehr Sinn, dass diese Eigenschaft null ist, wenn die Klasse zuerst initialisiert wird. Da apple Strukturen so verändert hat, dass sie viel enger mit Klassen zusammenhängen, halte ich das für einen wichtigen Unterschied. Es ist meiner Meinung nach ein Fehler, wenn man die Option explizit auf Null setzt.
Meine Argumentation dafür:
In der optionale Dokumentation alle Beispiele sind in Klassen.
Tags und Links swift