Ich versuche herauszufinden, wie eine statische Variable deklariert wird, die nur lokal für eine Funktion in Swift gültig ist.
In C könnte dies ungefähr so aussehen:
int foo() {
static int timesCalled = 0;
++timesCalled;
return timesCalled;
}
In Objective-C ist es im Grunde dasselbe:
- (NSInteger)foo {
static NSInteger timesCalled = 0;
++timesCalled;
return timesCalled;
}
Aber ich kann so etwas in Swift scheinbar nicht machen. Ich habe versucht, die Variable folgendermaßen zu deklarieren:
static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0
Dies alles führt jedoch zu Fehlern.
- Die erste Beschwerde "Statische Eigenschaften dürfen nur für einen Typ deklariert werden".
- Der zweite beschwert sich über "Erwartete Deklaration" (wo
static
ist) und "Erwartetes Muster" (wotimesCalledB
ist) - Der dritte beschwert sich über "Aufeinanderfolgende Anweisungen in einer Zeile müssen durch ';'" (im Leerzeichen zwischen Doppelpunkt und
static
) und "Erwarteter Typ" (wostatic
ist) getrennt werden. - Die vierte Beschwerde lautet "Aufeinanderfolgende Anweisungen in einer Zeile müssen durch ';'" (im Leerzeichen zwischen
Int
undstatic
) und "Erwartete Deklaration" (unter dem Gleichheitszeichen) getrennt werden.
struct Holder {…}
innerhalb mehrerer Funktionen zu deklarieren, und sie kollidieren nicht. Swift könntestatic let
ohne diesestruct
Boilerplate herum unterstützen.Eine andere Lösung
quelle
Swift 1.2 mit Xcode 6.3 unterstützt jetzt wie erwartet statisch. Aus den Versionshinweisen zur Beta-Version von Xcode 6.3:
Es scheint, dass Funktionen keine statischen Deklarationen enthalten können (wie in Frage gestellt). Stattdessen muss die Deklaration auf Klassenebene erfolgen.
Einfaches Beispiel für eine statische Eigenschaft, die innerhalb einer Klassenfunktion (auch als statische Funktion bezeichnet) inkrementiert wurde, obwohl eine Klassenfunktion nicht erforderlich ist:
Ausgabe:
quelle
static
Apple beabsichtigt sein könnte, obwohl man immer gerne einen Fehler einreichen kann , um eine Änderung anzufordern. In C wirdstatic
die Speicherung einer Variablen auf den Bereich der Quelldatei beschränkt (was nicht immer mit dem Klassenbereich identisch ist), während die Platzierung der Variablendeklaration den lexikalischen Bereich bestimmt (dh global vs innerhalb der Funktion vs viele verschachtelte{}
s). In Swift folgt der Speicherbereich immer dem lexikalischen Bereich, sodass Sie keine Variable haben können, die für eine Funktion lexikalisch ist und über globalen Speicher verfügt.Eine andere Lösung
quelle