Ich habe folgende Klasse:
class ReportView: NSView {
var categoriesPerPage = [[Int]]()
var numPages: Int = { return categoriesPerPage.count }
}
Die Kompilierung schlägt mit der Meldung fehl:
Das Instanzmitglied 'categoryPerPage' kann nicht für den Typ 'ReportView' verwendet werden.
Was bedeutet das?
swift
instantiation
getter-setter
computed-properties
Aderstedt
quelle
quelle
numPages
anstelle eines Abschlusses deklarieren, löschen Sie das Gleichheitszeichen:var numPages: Int { return categoriesPerPage.count }
categoriesPerPage
definiert alsvar
anstelle vonlet
.Antworten:
Sie haben nur einen Syntaxfehler, wenn Sie sagen
= {return self.someValue}
. Das=
wird nicht benötigt.Verwenden :
wenn du nur bekommen willst kannst du schreiben
Mit der ersten Möglichkeit können Sie auch Beobachter als
set
willSet
& hinzufügendidSet
so dass die Verwendung
= operator
als setterquelle
categoriesPerPage
, welches 2-Dim-Array mitv
welchem Int?set
beispielsweise von-Kurs können Sie nicht zuweisenint
in[int]
Für alle anderen, die darauf stoßen, stellen Sie sicher, dass Sie nicht versuchen, die Klasse und nicht die Instanz zu ändern! (es sei denn, Sie haben die Variable als statisch deklariert)
z.B.
quelle
static
Variable undinstance
Variable,MyClass.variable
ist gültig, wenn Sie es als statische Variable deklarieren (gemeinsam von allen Instanzen)Es heißt, Sie haben eine Instanzvariable (die Variable ist nur sichtbar / zugänglich, wenn Sie eine Instanz dieser Klasse haben) und Sie versuchen, sie im Kontext eines statischen Bereichs (Klassenmethode) zu verwenden.
Sie können Ihre Instanzvariable zu einer Klassenvariablen machen, indem Sie das Attribut static / class hinzufügen.
Sie instanziieren eine Instanz Ihrer Klasse und rufen die Instanzmethode für diese Variable auf.
quelle
Ein anderes Beispiel ist, Sie haben Klasse wie:
Sie erhalten auch die gleiche Art von Fehler wie:
Dies liegt daran, dass Sie Ihrer Methode das Schlüsselwort "class" zuweisen (wodurch Ihre Methode zu einer Typmethode wird) und Folgendes verwenden:
Aber wer hat die Variable playSong schon einmal gesetzt? OK. In diesem Fall sollten Sie kein Klassenschlüsselwort verwenden:
Jetzt können Sie gehen.
quelle
Manchmal fügt Xcode beim Überschreiben von Methoden
class func
statt nur hinzufunc
. In der statischen Methode können Sie dann keine Instanzeigenschaften sehen. Es ist sehr leicht zu übersehen. Das war mein Fall.quelle
Ihr anfängliches Problem war:
In früheren Beiträgen wurde korrekt darauf hingewiesen, dass das Vorzeichen fehlerhaft ist , wenn Sie eine berechnete Eigenschaft wünschen
=
.Zusätzliche Fehlermöglichkeit:
Wenn Sie beabsichtigen, "einen Standardeigenschaftswert mit einem Abschluss oder einer Funktion festzulegen" , müssen Sie ihn ebenfalls nur geringfügig ändern. (Hinweis: Dieses Beispiel war offensichtlich nicht dazu gedacht)
Anstatt das zu entfernen
=
, fügen wir hinzu()
, um einen Standard-Initialisierungsabschluss zu kennzeichnen. (Dies kann beim Initialisieren von UI-Code hilfreich sein, um alles an einem Ort zu speichern.)Es tritt jedoch genau der gleiche Fehler auf:
Das Problem besteht darin, eine Eigenschaft mit dem Wert einer anderen zu initialisieren. Eine Lösung besteht darin, den Initialisierer zu erstellen
lazy
. Es wird erst ausgeführt, wenn auf den Wert zugegriffen wird.jetzt ist der compiler glücklich!
quelle
Ich habe immer wieder den gleichen Fehler bekommen, obwohl ich die Variable gemacht habe
static
. Lösung: Clean Build, Abgeleitete Daten bereinigen, Xcode neu starten. Oder Verknüpfung Cmd + Umschalt + Alt + K.quelle
Nur für den Fall, dass jemand wirklich einen solchen Verschluss benötigt , kann dies folgendermaßen geschehen:
quelle