Äquivalent öffentliche statische Finale Variablen
Ich verstehe, dass Sie das Wort extern
vor einer Variablen-Deklaration in einer header-Datei deklariert die Existenz einer globalen static-variable ohne Initialisierung es. Ich verstehe auch, dass wenn ich importieren Sie die Datei mit der extern
Variablen, kann ich Sie verweisen, ohne eine Klasse/Datei-Namen. Aber wo findet man diese definieren und Ihre Werte?
Was ich versuche zu tun ist, erstellen Sie eine Klasse mit Konstanten Globale Konstanten, die ich verwenden möchten, die in der gesamten iOS-Anwendung code.
Wird man Sie in der Benutzeroberfläche?
Beispiel.h
#import <Foundation/Foundation.h>
@interface Constraints : NSObject
{
extern NSString * const PREFS_NAME;
}
Oder ist man dann außerhalb der Schnittstelle, wie diese
Beispiel.h
#import <Foundation/Foundation.h>
extern NSString * const PREFS_NAME;
@interface Constraints : NSObject
{
}
Dann in die Umsetzung .m-Datei, wie man Sie initialisieren die Werte extern?
Innerhalb der Umsetzung Gegend wie dieser?
Beispiel.m
#import "Constraints.h"
@implementation Constraints
/**PRefecences name for the application**/
const NSString * PREFS_NAME = @"MyApp_Prefs";
@end
Tun oder initialisieren Sie Sie außerhalb der Umsetzung Gegend wie diese:
Beispiel.m
#import "Constraints.h"
/**PRefecences name for the application**/
const NSString * PREFS_NAME = @"MyApp_Prefs";
@implementation Constraints
@end
Oder muss ich Ihnen Ihre ursprünglichen Werte in einen Konstruktor? oder einige beliebige statische Stil Methode mit +
vor es also +(void) setAppConstraints
;
Ich habe versucht, mehrere Kombinationen, aber immer Fehler auftreten, wie "Neudefinition von 'xVariable' mit einer anderen Art". Oder etwas über "extern nicht über eine "Schnittstelle initialisieren" (oder so ähnlich, habe ich vergessen). Ich will also wissen, wie zu declaire und initialisieren Sie Sie richtig zu bilden, die gleiche Rolle wie public static final
Variablen in Java.
Auch, was sind die Grenzen der extern
Befehl? Ich weiß, ich kann extern
eine NSInteger
oder NSString
, aber was NSArray
?
Ich Stelle diese Frage, weil es scheint, zu viel irreführende oder unvollständige Informationen über den Einsatz von extern
in Objective-C. Viele der Antworten scheinen speculatory. Meine Hoffnung ist, für diese Frage eine gute Ressource, nicht nur für mich, aber zu begrenzen und weitere ähnliche Fragen über die Grundlagen der extern
.
- mögliche Duplikate von die Verwendung von "extern" Schlüsselwort bei der Definition der variable
- Wenn Sie auf "erstellen Sie eine Klasse der Konstanten", das hat nichts zu tun mit globalen Variablen, denn Sie gehören nicht zu einer Klasse. Sie müssen ivars für, die.
- Cashwell möglich sein eine ähnliche Frage. Aber wie ich bereits in meiner Frage, der text, die Antwort auf alle Fragen fand ich auf S/O unvollständig waren, oder Links mehr Fragen als Antworten.
- Caswell, ich will ein weltweit zugänglich Konstante Werte. Das deutet nicht auf iVars mir. Ich glaube, ich könnte ein singleton, aber immer noch nicht erklären wie das sein konnte, erreicht, mit extern, die mich korrigieren, wenn ich falsch bin, ist eine gültige Fall für den Befehl und eine, die es für entworfen wurde.
- Ihre Frage hat mehrere Missverständnisse in der es, so finde ich es schwer zu glauben, dass Sie tatsächlich Lesen Sie alle Duplikate, die Sie sagen, Sie gefunden zu haben. Wie für die "Global zugänglich Konstante Werte", wenn es das ist, was Sie wollen, dann wollen Sie nicht eine Klasse.
- Caswell Bingo, das ich verwenden möchte von extern-also wie?
- Es ist nicht ein "Befehl".
- Können Sie dann bitte erklären, was es ist, und warum es immer angedacht als eine sinnvolle alternative Java public static Klassenvariablen.
- Haben Sie gesehen, diese drei Fragen? Referenz auf ein static NSString const anderen Klasse, Wo verschiedene variable und Methode-Typen sollten in ein header?, Auf verzögerte Instanziierung und convenience-Methoden
- Caswell ja, Sie waren genau die Art von Artikel, die meinte ich auch. Keiner von diesen erklären, wo in der .m-Datei sollte ich meine initialisieren Variablen exten. Alles, was Sie sagen, ist in der .m-Datei. Sie haben auch nicht meine Frage beantworten, welche Daten-Typen, die ich verwenden kann mit der extern-zum Beispiel arrays erlaubt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren Sie es Wert ist, in die Datei in dem er erklärt, was in Ihrem Fall ist Beispiel.m; Sie können noch re-ordnen Sie diese variable, so dass die Erklärung im Beispiel.h würde so Aussehen:
Diese Weise wird jede Datei, die importiert Beispiel.h hat Zugriff auf diese variable. Das entspricht public static final in Objective-C ist const. Wenn Sie auch wollen, dass es öffentlich sein, Sie sollte es sein, eine Instanz der Klasse variable, aber in diesem Fall, Sie brauchen es nicht, weil es bereits zugänglich, überall. Also in diesem Fall wäre es:
Beachten Sie auch, dass NSString const* unterscheidet sich von NSString* const. Letzteres ist ein const Zeiger auf NSString. Der ehemalige hat nicht Sinn, auch wenn es eine korrekte syntax. In Objective-C, die const-qualifier nicht auf Objekte, sondern stattdessen mutable und immutable-Klassen. Hätte es Sinn, in C++ - das heißt, Sie können nur const-Methoden, die auf die Instanz.
extern
signalisiert dem compiler, dass Sie verwenden eine variable oder eine Funktion, die definiert wird, in einer anderen compilation unit.Wenn Sie sagen
extern const NSString *PREFS_NAME
, du sagst "Ersetzen Sie alle Verweise in dieser compilation unit zu PREFS_NAME der Variablen PREFS_NAME, wie es ist in einer anderen Datei definiert." Also, wenn Sie versuchen, zuweisen PREFS_NAME in Ihr .m, was Sie tun, ist versuchen, einer Variablen zuweisen, dass, obwohl es einen Namen hat, dann existiert es nicht. Deklarieren Sie eine variableextern
ist nur eine Deklaration einer Variablen oder Funktion, nicht eine definition an, dass eine variable oder Funktion. Er ermöglicht, dass der compiler weiß, dass die Namen im Einsatz ist, und dass der linker wird sich darum kümmern, was mit ihm zu tun, aber auch wenn Sie einen Typ hier, es hat nicht wirklich beiseite Platz für die variable ein, es ist erwartete, dass der Raum, der neben dem compilation unit, das ist eigentlich die variable definieren.Kompilieren Sie drei oder vier verschiedene source-code-Dateien zusammen, drei von Ihnen kann erklären:
extern int buffer[];
Und man kann erklären
int buffer[BUFSIZE];
In seiner globalen Reichweite, und der linker hat die Aufgabe zu lösen, die drei deklarierten Verweise auf
extern buffer
auf die vierte, die eigentliche definition des Puffers.extern
ist zu C-Variablen und-Funktionen viel wie@class
ist, die Objective-C-Klassen, es ist eine vorwärts-Deklaration, ein Versprechen an den compiler, dass Sie nicht ausflippen, wenn Sie sehen, ein name, der Undefinierte hier, da der linker Antworte auch immer auf veraltete Fragen, die Sie haben können.extern
oder ordnen Sie Sie in den globalen scope von Ihr .m-Datei. Sie würde NICHT verwenden Sie dieextern
Schlüsselwort ein, wenn Sie die Initialisierung, und Sie lieber NICHT verwenden würde diestatic
Schlüsselwort.static
ist das Gegenteil vonextern
es schränkt die variable definition der compilation unit, und nicht anderen erlauben, zu verweisen.#define PREFS_NAME @"MyApp_Prefs"
... Wir alle laufen kreischend aus dem Gedanken derpublic static final
und was es bedeuten könnte 🙂@interface
und sieht im Grunde Recht. Dein line-in .m sollte außerhalb Ihrer Umsetzung und einfach nur Lesen:NSString *PREFS_NAME=@"MyApp_Prefs";
Keine weitere Qualifikation erforderlich sein sollten, die auch sicherstellen, dass Sieconsts
sind an der gleichen Stelle beide Male.const NSString *
undNSString * const
unterschiedliche Dinge bedeuten.