statisches NSDictionary * const letterValues ​​= @ {...} in einer Methode kompiliert nicht

8

In ein Wortspiel für iPhone :

Ich versuche, den folgenden Code in meiner benutzerdefinierten Ansicht zu verwenden Tile. m :

%Vor%

Leider bekomme ich dadurch einen Kompilierfehler Initialisierungselement ist keine Kompilierzeitkonstante und ich muss das static Schlüsselwort entfernen, um meine App in Xcode kompilieren zu lassen (hier Vollbild ):

Ich denke, ich initialisiere die NSDictionary korrekt - indem ich die neuen Objective-C-Literale verwende Syntax.

Aber warum kann ich static hier nicht benutzen?

Ich dachte, es wäre hier angebracht, sicherzustellen, dass meine Konstante letterValues nur einmal gesetzt ist?

    
Alexander Farber 20.03.2014, 13:19
quelle

3 Antworten

33

Sie können eine statische Variable nur während der Initialisierung mit einer Konstante setzen. @ {} erzeugt ein Objekt, also keine Konstante.

Tun Sie dies stattdessen:

%Vor%

Einige andere Antworten deuten hier auf eine Überprüfung auf null statt auf einmal hin, aber das kann Probleme verursachen, wenn mehrere Kacheln gleichzeitig (über Threads) erstellt werden. dispatch_once implementiert die erforderliche Sperre.

    
Dave Wood 20.03.2014, 14:00
quelle
4

Sie können statisch verwenden, aber die Zuweisung kann nicht in derselben Zeile erfolgen. Versuchen Sie Folgendes:

%Vor%

Der Grund dafür ist, dass die @{<key> : <value>} -Syntax vom Compiler in eine Objective-C-Methode ( [[NSPlaceholderDictionary alloc] initWithObjects:forKeys:count:] ) übersetzt wird, die zur Kompilierungszeit nicht aufgelöst werden kann.

    
Austin 20.03.2014 13:24
quelle
1

NSDictionary -Objekte können nicht zur Kompilierzeit erstellt werden. Wenn Sie jedoch ein statisches Objekt benötigen, können Sie eines erstellen. Sie können zum Beispiel die Methode initialize wie folgt verwenden:

%Vor%

Die if-Anweisung verhindert mehrere Aufrufe Ihres Codes in MyClass subclasses.

    
Adam 20.03.2014 13:28
quelle