Wie konvertiere ich eine NSInteger in eine int?

97

Zum Beispiel, wenn Sie eine valueNachricht an eine NSIntegersolche Instanz übergeben

[a value] es verursacht einen EXC_BAD_ACCESS.

Wie konvertiere ich ein NSIntegerin int?

Wenn es relevant ist, werden nur kleine Zahlen <32 verwendet.

Jeffrey
quelle
2
Sie scheinen ziemlich verwirrt zu sein. [ein Wert] legt nahe, dass Sie erwarten, dass a ein Objekt ist, aber dass es im Moment eine NSInteger ist. "Konvertieren" in ein int löst dieses Problem nicht.
Mike Abdullah

Antworten:

205

Ta da:

NSInteger myInteger = 42;
int myInt = (int) myInteger;

NSIntegerist nichts weiter als ein 32/64 Bit int. (Es wird die entsprechende Größe verwendet, je nachdem, welches Betriebssystem / welche Plattform Sie ausführen.)

Dave DeLong
quelle
13
Um genau zu sein, denke ich, dass NSInteger ein Int auf 32-Bit-Plattformen und ein Long auf 64-Bit-Plattformen ist.
Frédéric Adda
5
Ich erhalte eine Warnung mit dem vorgeschlagenen "Casting": Die implizite Konvertierung verliert an ganzzahliger Genauigkeit: 'NSUInteger' (auch bekannt als 'unsigned long') in 'int'
djcj
@djcj, ja, die Antwort ist für neue SDKs nicht korrekt. Meiner Ansicht nach.
Azik Abdullah
Wäre es nicht viel einfacher, (int) einfach vor die NSInteger zu stellen? Beispiel: (int) myInteger, wenn Sie das Ganzzahlformular aufrufen möchten, damit Sie keine neue Variable erstellen müssen.
Chandhooguy
2
@chandhooguy warum versuchst du eine neue Variable zu vermeiden?
Dan Rosenstark
28

Wenn Sie dies inline tun möchten, setzen Sie einfach das NSUIntegeroder NSIntegerauf ein int:

int i = -1;
NSUInteger row = 100;
i > row // true, since the signed int is implicitly converted to an unsigned int
i > (int)row // false
Samuel Clay
quelle
1
Warum veröffentlichen Sie aus Neugier 2 Jahre später eine Antwort auf eine Frage, die bereits eine akzeptierte Antwort mit zweistelligen Stimmen hat? Zumal Ihre Antwort nur eine Umformulierung ist.
Lily Ballard
6
Weil meine Antwort eine einzelne Zeile ist (unter Verwendung eines Inline-Typs cast - the (int)), was meiner Meinung nach das ist, was das OP möchte. Ich habe mich selbst darum gekümmert und festgestellt, dass alle Antworten zu diesem Thema mehrzeilig waren.
Samuel Clay
2
Die akzeptierte Antwort zeigt eine implizite Konvertierung mit einer einzelnen Zeile. Abizerns Antwort erklärt, dass eine implizite Konvertierung erfolgt, wenn Sie versuchen, einen NSIntegerWert anstelle von a zu verwenden int. In keinem Fall handelt es sich um eine mehrzeilige Lösung.
Lily Ballard
25
Ich hätte klarer sein sollen. Da dies eine etwas unerfahrene Frage ist, ist es für den unerfahrenen Programmierer möglicherweise nicht offensichtlich, dass er inline mit einem (int) Ausdruck konvertieren kann. Die anderen Antworten zeigen dies nicht und ich denke, es hilft jedem, der auf dieser Seite stolpert.
Samuel Clay
4
Und ich stolperte noch anderthalb Jahre später auf dieser Seite und brauchte speziell die NSUInteger-bezogene Besetzung. Danke, Samuel!
Leanne
18

Ich bin mir nicht sicher, unter welchen Umständen Sie ein NSIntegerin ein konvertieren müssen int.

NSInteger ist nur ein typedef:

NSInteger Wird verwendet, um eine Ganzzahl zu beschreiben, unabhängig davon, ob Sie für ein 32-Bit- oder ein 64-Bit-System erstellen.

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

Sie können NSIntegerjeden Ort verwenden, den Sie verwenden, intohne ihn zu konvertieren.

Abizern
quelle
2
Hier ist ein guter Grund, eine NSUinteger in einen int: value-Vergleich umzuwandeln. (int i = -1)> (NSUinteger j = 14) konvertiert das int in unsigned, was -1> 14 bedeutet, was nicht das ist, was Sie wollen.
Samuel Clay
1
@ SamuelClay. Ein guter Punkt, wenn in bestimmten Fällen verwendet. Persönlich würde ich eine NSUInteger in eine Uint konvertieren. Jedoch. Die Frage betraf die Konvertierung von NSInteger, nicht von NSUInteger.
Abizern
Ich habe nur ein vorzeichenloses int verwendet, um eine häufige Gefahr darzustellen. Es ist für beide die gleiche Besetzung, wie meine Antwort zeigt. Es ist kein schwieriges Problem, aber es ist häufig genug und ich habe noch niemanden gesehen, der eine einzeilige Antwort empfiehlt.
Samuel Clay
0

In UIsegmentedControl häufig verwendet, wird beim Kompilieren in 64-Bit statt 32-Bit "Fehler" angezeigt. Eine einfache Möglichkeit, es nicht an eine neue Variable zu übergeben, besteht darin, die folgenden Tipps zu verwenden: add (int) :

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]];

anstatt :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
Grominet
quelle