Jak przekonwertować An NSInteger na int?

97

Na przykład podczas przekazywania valuewiadomości do takiej NSIntegerinstancji

[a value] powoduje to EXC_BAD_ACCESS.

Jak więc przekonwertować NSIntegerna int?

Jeśli ma to znaczenie, używane są tylko małe liczby <32.

Jeffrey
źródło
2
Wydajesz się być raczej zdezorientowany. [a value] sugeruje, że oczekujesz, że a będzie obiektem, ale w tej chwili jest to NSInteger. „Konwersja” do typu int nie rozwiąże tego problemu.
Mike Abdullah

Odpowiedzi:

205

Ta da:

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

NSIntegerto nic innego jak 32/64 bitowe int. (użyje odpowiedniego rozmiaru w zależności od używanego systemu operacyjnego / platformy)

Dave DeLong
źródło
13
Mówiąc dokładniej, myślę, że NSInteger to int na platformach 32-bitowych i długi na platformach 64-bitowych.
Frédéric Adda
5
Otrzymuję ostrzeżenie przy użyciu sugerowanego „rzutowania”: Niejawna konwersja traci precyzję liczb całkowitych: „NSUInteger” (inaczej „unsigned long”) na „int”
djcj
@djcj, tak, odpowiedź jest nieprawidłowa dla nowych zestawów SDK. Myślę.
Azik Abdullah
Czy nie byłoby łatwiej po prostu umieścić (int) przed NSInteger? Na przykład (int) myInteger za każdym razem, gdy chcesz wywołać postać liczby całkowitej, aby nie trzeba było tworzyć nowej zmiennej.
chandhooguy
2
@chandhooguy dlaczego próbujesz uniknąć nowej zmiennej?
Dan Rosenstark
28

Jeśli chcesz to zrobić w tekście, po prostu prześlij NSUIntegerlub NSIntegerdo 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
źródło
1
Tak z ciekawości, dlaczego 2 lata po fakcie piszesz odpowiedź na pytanie, na które już została zaakceptowana odpowiedź z liczbą głosów dwucyfrową? Zwłaszcza, że ​​twoja jest tylko przeformułowaniem tej odpowiedzi.
Lily Ballard,
6
Ponieważ moja odpowiedź to pojedyncza linia (przy użyciu rzutowania typu inline - (int)), co, jak sądzę, może chcieć OP. Sam przyjrzałem się temu i zauważyłem, że wszystkie odpowiedzi na ten temat były wielowierszowe.
Samuel Clay
2
Zaakceptowana odpowiedź przedstawia niejawną konwersję przy użyciu jednego wiersza. Odpowiedź Abizern wyjaśnia, że ​​niejawna konwersja nastąpi, jeśli spróbujesz użyć NSIntegerwartości zamiast int. W żadnym przypadku nie jest to rozwiązanie wieloliniowe.
Lily Ballard
25
Powinienem był być wyraźniejszy. Ponieważ jest to nieco nowatorskie pytanie, dla początkującego programisty może nie być oczywiste, że mogą oni konwertować inline z wyrażeniem (int). Inne odpowiedzi nie pokazują tego i myślę, że pomaga to każdemu, kto potknie się na tej stronie.
Samuel Clay
4
Natknąłem się na tę stronę jeszcze półtora roku później, potrzebując specjalnie obsady związanej z NSUInteger . Dzięki, Samuel!
leanne
18

Nie jestem pewien co do okoliczności, w których trzeba zamienić rozszerzenie NSIntegerna int.

NSInteger to po prostu nazwa typu:

NSInteger Używany do opisywania liczby całkowitej niezależnie od tego, czy tworzysz dla systemu 32-bitowego czy 64-bitowego.

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

Możesz użyć NSIntegerdowolnego miejsca, którego używasz, intbez jego konwersji.

Abizern
źródło
2
Oto dobry powód, aby chcieć przekonwertować NSUinteger na porównania int: value. (int i = -1)> (NSUinteger j = 14) konwertuje wartość int na unsigned, co oznacza -1> 14, co nie jest tym, czego chcesz.
Samuel Clay,
1
@SamuelClay. Dobry punkt, gdy jest używany w określonych przypadkach. Osobiście zamieniłbym NSUInteger na uint. Jednak. Pytanie dotyczyło konwersji NSInteger, a nie NSUInteger.
Abizern
Użyłem tylko niepodpisanego int, aby zilustrować powszechną pułapkę. To ten sam typ rzutowania dla obu, jak pokazuje moja odpowiedź. Nie jest to trudny problem, ale jest dość powszechny i ​​nie widziałem jeszcze nikogo, kto poleciłby odpowiedź jednoliniową.
Samuel Clay
0

Powszechnie używany w UIsegmentedControl, "błąd" pojawia się podczas kompilacji w 64-bitowej zamiast 32-bitowej. Łatwym sposobem na nieprzekazanie go do nowej zmiennej jest skorzystanie z tych wskazówek, dodaj (int) :

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

zamiast :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
grominet
źródło