Swift-Variable verwendet, innerhalb Ihrer eigenen anfänglichen Wert
Ich versuche zu initialisieren eines Objekts, und ich bekomme diese Fehlermeldung: Variable used within its own initial value
Hier ist mein code:
Warum kann ich das nicht so?
- Klassennamen beginnen mit einem Großbuchstaben. Instanz-Namen beginnen mit einem Kleinbuchstaben. Es gibt einen Grund dafür.
public class Entry: NSObject
. Having said that, looking at Eintrag Klasse sollte es wohl ein struct. - Warum geben Sie der öffentlichkeit explizit überall ?
- aus dem Speicher Verbrauch Perspektive, Eintrag sollte man eher eine Klasse (das ist der Typ der Referenz) und dann ein struct (das ist ein Wert, Typ und wird kopiert werden, die alle die Weise herum, wenn Sie neue "var/let Referenzen" zu erscheinen). Auch ich denke, dass der Eintrag sein soll, eine Unterklasse von NSObject (aus Gründen der KVO Nutzung oder was auch immer).
- Ich bin nicht einverstanden. Der Speicherverbrauch dieser Daten ist minimal zu dem Punkt des seins zu vernachlässigen. Mit Referenz-Typen können aber auch komplexer sein, wie Sie bekommen können, in Situationen, wo mehrere Teile von er app können die Daten verändert werden an der gleichen Zeit. Es schwieriger wird, eine Quelle der "Wahrheit". Mit value-type-Objekte dies ist nicht ein Problem, und Teile der app benötigen, zu mutieren geschrieben werden können, mit der Absicht, mutiert und vorbei an mutierten Daten zurück etc... es ist immer eine Quelle der Wahrheit.
- wie gesagt, es ist alles über den Speicherverbrauch allein. Ich habe nicht gesprochen über die Veränderlichkeit überhaupt. Ihre Sicht ist so gut wie meine, nur es betrifft einen ganz anderen Aspekt.
- ja, aber wie, antwortete ich... Es ist nicht über das Gedächtnis überhaupt. Wenn Sie über 1000 events und Sie sind Referenz-Typ bestimmen Sie dann auf Bearbeiten, dann haben Sie 1000 Veranstaltungen. Wenn Sie Wert geben, dann haben Sie 1001 Veranstaltungen. Selbst dann, die Speicher-Grenzen des aktuellen Geräte würden es ermöglichen, halten Zehntausende von Veranstaltungen im Speicher. Sie sind so trivial, dass Sie nehmen sehr wenig Speicher. Die Vorteile, die Wert geben Sie die Daten weit hinaus wiegt die geringe Speichernutzung zu verringern.
- es ist eine WWDC-video, dass ich finden kann, ein link für Sie, wenn Sie möchten. Es erklärt es viel besser als ich kann in die Kommentare. 🙂
- wäre nett von dir 🙂
- Sitzung 414: Building better apps mit Wert-Typen. Von der diesjährigen wwdc.
- vielen Dank für den Hinweis. Ich werde auf jeden Fall beobachten und überdenken unsere Diskussion.
- okay, das video erklärt, dass ein sctruct aus strings teilt die string-Felder unter all den Kopien einer Instanz (hinter den kulissen), bis es auf die verwiesen wird, mit var und mutiert. Dies ist nicht offensichtlich und ist eine Art intrinsische bereitgestellt durch die Swift-runtime für die variable-Länge-Wert-Typen. Vielen Dank für das video wieder, es hat mir sehr geholfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Antworten richtig sind. Ich würde gern ein paar Vorschläge hier, da sehe ich viele sehr unschöne Dinge, in die Ihr code :[
1. Geben Sie die Namen sollten UpperCamelCase
So nennen Sie Ihre Klasse
Entity
stattentity
2. Erweiterung NSObject...
Warum
Entity
erweiternNSObject
? Haben Sie einen gültigen Grund, es zu tun?3. Sichtbarkeit
Ich sehe viele
public
im code. Warum? Erstellen Sie eine Bibliothek? Denn wahrscheinlich gibt es keine Notwendigkeit, umpublic
all das Zeug.4. Struct statt der Klasse
Wenn
Entity
ist einfach ein container für eine ganze Reihe von Daten es sollte einestruct
, nicht einclass
. Sie erhalten bessere Leistung.5. Die "erstellt" - Eigenschaft als String deklariert? Ernsthaft?
Zu oft sehe ich code, wo die
String
Typ verwendet wird, in vielen anderen Arten (wieInt
,NSDate
,Bool
, ...). Warum? Dieses macht Sie extrem schwierig zu behandeln, dass der Wert jedes mal, wenn Sie brauchen, um eine bestimmte Aktion ausführen/prüfen, die sich strikt vom Typ real (wie das hinzufügen von zahlen, vergleichen der Termine, etc...)6. Alles initialisiert zu "" warum?
Was bedeutet es, wenn
created
ist ein leerer string? Wenn Sie mit den leerenString
zu Kennzeichnen das fehlen eines Wertes sollten Sie verwendennil
statt (wodurch natürlich der Eigenschaft ein optionaler Typ).Hoffe, das hilft 🙂
public
die Eigenschaft wirdinternal
dann sichtbar, um Ihr gesamtes Projekt. Dies sollte genug sein, um darauf zuzugreifen. Jedenfalls nicht manuell schreiben, Getter/setter. 4), Wenn Sie Ihren API sendet Sieno time set
, setzen Sie einfach die Eigenschaft zunil
: es ist ein besserer Weg, um auszudrücken, keinen Wert, dann wird der textno time set
.Du kannst nicht geben eine variable den gleichen Namen wie ein Typ: der compiler ist immer verwirrt, und Sie denkt Ihr Verweis auf
entry
die Art bezieht sich aufentry
die neue variable, daher die Warnung.Die beste Lösung ist die Verwendung von CamelCase-Namen für Typen und llamaCase Namen für Variablen, wie empfohlen von Apple in "The Swift Programming Language". Zum Beispiel:
und
(Beachten Sie auch, dass Sie nicht brauchen explizit den Typ des
entry
variable, wie es ist leicht, die sich aus Ihren Wert.)Müssen Sie nur eine Kollision der name des Eintrags variable Referenz-und der Einstiegsklasse. Nur benennen Sie den Eintrag Klasse: machen Sie den "Einstieg" zum Beispiel.
Ändern Sie den Namen der Instanz, da Sie nicht verwenden können, den gleichen Namen wie die Klasse. Zusätzlich sollten Sie ändern den Namen der Klasse, die Großbuchstaben, wo es einfacher wird, unterscheiden sich die Klasse, den Namen und die Instanz