101 Stimmen

Wie konvertiert man einen NSInteger in einen int?

Zum Beispiel bei der Übergabe einer value Nachricht an eine NSInteger zum Beispiel so

[a value] verursacht es einen EXC_BAD_ACCESS.

Wie konvertiert man also eine NSInteger a int ?

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

2 Stimmen

Sie scheinen ziemlich verwirrt zu sein. [a value] deutet darauf hin, dass Sie erwarten, dass a ein Objekt ist, aber dass es im Moment ein NSInteger ist. Die "Umwandlung" in einen int löst dieses Problem nicht.

214voto

Dave DeLong Punkte 240835

Na also:

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

NSInteger ist nichts anderes als ein 32/64-Bit-Int (je nach Betriebssystem/Plattform wird die entsprechende Größe verwendet)

13 Stimmen

Um genau zu sein, ich denke, NSInteger ist ein int auf 32-Bit-Plattformen und ein long auf 64-Bit-Plattformen.

5 Stimmen

Ich erhalte eine Warnung, wenn ich das vorgeschlagene "Casting" verwende: Implizite Konvertierung verliert Integer-Präzision: 'NSUInteger' (auch bekannt als 'unsigned long') zu 'int'

0 Stimmen

@djcj, ja, die Antwort ist für neue SDKs nicht korrekt. Ich denke.

27voto

Samuel Clay Punkte 1233

Wenn Sie dies inline tun möchten, geben Sie einfach die NSUInteger o NSInteger zu einer 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

2 Stimmen

Nur aus Neugierde: Warum posten Sie 2 Jahre später eine Antwort auf eine Frage, auf die es bereits eine akzeptierte Antwort mit zweistelligen Stimmenzahlen gibt? Zumal Ihre Antwort nur eine Umformulierung dieser Antwort ist.

6 Stimmen

Denn meine Antwort ist eine einzige Zeile (mit einer Inline-Typ-Cast - die (int)), die ich denke, ist, was der OP wollen könnte. Ich habe mir das selbst angeschaut und festgestellt, dass alle Antworten zu diesem Thema mehrzeilig waren.

3 Stimmen

Die akzeptierte Antwort zeigt eine implizite Konvertierung mit einer einzigen Zeile. Die Antwort von Abizern erklärt, dass eine implizite Konvertierung stattfindet, wenn Sie versuchen, eine NSInteger Wert anstelle eines int . In beiden Fällen handelt es sich nicht um eine mehrzeilige Lösung.

18voto

Abizern Punkte 137651

Ich bin mir nicht sicher, unter welchen Umständen Sie eine NSInteger zu einer 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 bauen.

#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 verwenden NSInteger überall dort, wo Sie eine int ohne sie zu konvertieren.

2 Stimmen

Es gibt einen guten Grund, einen NSUinteger in einen int zu konvertieren: Wertevergleiche. (int i = -1) > (NSUinteger j = 14) konvertiert den int-Wert in einen Wert ohne Vorzeichen, d.h. -1 > 14, was nicht das ist, was Sie wollen.

1 Stimmen

@SamuelClay. Ein gutes Argument, wenn es in bestimmten Fällen angewendet wird. Persönlich würde ich einen NSUInteger in einen uint umwandeln. Jedoch. Die Frage war über die Konvertierung NSInteger, nicht NSUInteger.

0 Stimmen

Ich habe einen unsigned int nur verwendet, um eine häufige Falle zu illustrieren. Wie meine Antwort zeigt, handelt es sich in beiden Fällen um denselben Typ. Es ist kein schwieriges Problem, aber es ist häufig genug, und ich habe noch niemanden gesehen, der eine einzeilige Antwort empfiehlt.

-1voto

grominet Punkte 264

Häufig in UIsegmentedControl verwendet, "Fehler" erscheinen, wenn in 64bits statt 32bits kompiliert, einfache Möglichkeit für nicht übergeben es an eine neue Variable ist, diese Tipps verwenden, fügen (int) :

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

anstelle von:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X