NSInteger를 int로 변환하는 방법?


97

예를 들어 다음 과 같이 인스턴스에 value메시지를 전달할 때NSInteger

[a value] EXC_BAD_ACCESS가 발생합니다.

그래서 어떻게이 변환 NSIntegerint?

관련이있는 경우 32 미만의 작은 숫자 만 사용됩니다.


2
당신은 다소 혼란스러워 보입니다. [값]은 a가 객체가 될 것으로 예상하지만 현재는 NSInteger라고 제안합니다. int로 "변환"하면 문제가 해결되지 않습니다.
Mike Abdullah

답변:


205

따다 :

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

NSInteger32/64 비트 정수에 지나지 않습니다. (실행중인 OS / 플랫폼에 따라 적절한 크기를 사용합니다.)


13
정확히 말하면 NSInteger는 32 비트 플랫폼에서는 int이고 64 비트 플랫폼에서는 long이라고 생각합니다.
Frédéric Adda 2014 년

5
제안 된 "캐스팅"을 사용하여 경고를
받았습니다

@djcj, 예, 새 SDK에 대한 답변이 올바르지 않습니다. 나는 생각한다.
Azik Abdullah 2014

NSInteger 앞에 (int)를 넣는 것이 훨씬 쉽지 않을까요? 예를 들어, 정수 형식을 호출 할 때마다 (int) myInteger를 입력하면 새 변수를 만들 필요가 없습니다.
chandhooguy 2014

2
@chandhooguy 왜 새로운 변수를 피하려고합니까?
Dan Rosenstark

28

이 작업을 인라인으로하려면 NSUInteger또는 NSInteger을 다음과 같이 캐스트하십시오 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

1
호기심 때문에 이미 두 자리 수로 투표가 허용 된 질문에 대해 2 년 후 답변을 게시하는 이유는 무엇입니까? 특히 당신의 대답은 그 대답을 바꾸는 것입니다.
Lily Ballard 2012 년

6
내 대답은 (인라인 유형 캐스트-(int)를 사용하는) 한 줄이기 때문에 OP가 원하는 것이라고 생각합니다. 나는 이것을 직접 조사했고 주제에 대한 모든 대답이 여러 줄로되어 있음을 알았습니다.
사무엘 클레이

2
허용되는 답변은 한 줄을 사용하는 암시 적 변환을 보여줍니다. Abizern의 답변은 .NET NSInteger대신 값 을 사용하려고하면 암시 적 변환이 발생한다고 설명 합니다 int. 두 경우 모두 다중 라인 솔루션이 아닙니다.
Lily Ballard 2012 년

25
나는 더 명확 했어야했다. 이것은 다소 초보적인 질문이기 때문에 (int) 표현식으로 인라인으로 변환 할 수 있다는 것이 초보 프로그래머에게는 분명하지 않을 수 있습니다. 다른 답변은 이것을 표시하지 않으며이 페이지에서 비틀 거리는 사람에게 도움이된다고 생각합니다.
사무엘 클레이

4
그리고 나는 또 다른 1 년 반 후에이 페이지를 우연히 발견했고, 특별히 NSUInteger 관련 캐스트 가 필요했습니다 . 감사합니다, 사무엘!
leanne 2014-04-25

18

나는 당신이 변환해야하는 상황에 대한 확실하지 않다 NSIntegerint.

NSInteger는 단지 typedef입니다 :

NSInteger 32 비트 또는 64 비트 시스템 용으로 빌드하는지 여부와 관계없이 정수를 설명하는 데 사용됩니다.

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

사용 NSInteger하는 모든 장소를 int변환하지 않고 사용할 수 있습니다 .


2
NSUinteger를 int : value 비교로 변환하려는 좋은 이유가 있습니다. (int i = -1)> (NSUinteger j = 14)는 int를 unsigned로 변환합니다. 즉, -1> 14는 원하는 것이 아닙니다.
사무엘 클레이

1
@SamuelClay. 특정 경우에 사용할 때 좋은 점입니다. 개인적으로 NSUInteger를 uint로 변환합니다. 하나. 문제는 NSUInteger가 아니라 NSInteger를 변환하는 것에 관한 것이 었습니다.
Abizern

나는 일반적인 함정을 설명하기 위해 unsigned int 만 사용했습니다. 내 대답에서 알 수 있듯이 둘 다에 대해 동일한 유형 캐스트입니다. 어려운 문제는 아니지만 충분히 일반적이며 아무도 한 줄로 된 답변을 추천하는 사람을 보지 못했습니다.
Samuel Clay

0

UIsegmentedControl에서 일반적으로 사용되는 "오류"는 32 비트 대신 64 비트로 컴파일 할 때 나타납니다. 새 변수에 전달하지 않는 쉬운 방법은 다음 팁을 사용하는 것입니다. (int) 추가 :

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

대신에 :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.