如何将NSInteger转换为int?


97

例如,当将value消息传递到这样的NSInteger实例时

[a value] 它会导致EXC_BAD_ACCESS。

那么如何将转换NSIntegerint

如果相关,则仅使用<32的小数字。


2
您似乎很困惑。[一个值]建议您期望a是一个对象,但是此刻它是一个NSInteger。“转换”为int不会解决该问题。
Mike Abdullah,2009年

Answers:


205

塔达:

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

NSInteger无非就是32/64位int。(它将根据您所运行的操作系统/平台使用适当的大小)


13
确切地说,我认为NSInteger在32位平台上是int,在64位平台上是long。
弗雷德里克·阿达

5
我使用的建议“铸造”得到一个警告:隐式转换损失整数精度:“NSUInteger”(又名“无符号长”),以“廉政”
djcj

@djcj,是的,答案对于新的SDK不正确。我认为。
阿齐克·阿卜杜拉

将(int)放在NSInteger前面会不会容易得多?例如,每当您要调用整数形式时都使用(int)myInteger,这样就不必创建新变量。
chandhooguy 2014年

2
@chandhooguy为什么要避免使用新变量?
丹·罗森斯塔克

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
出于好奇,您为什么要在事实已经两年后的问题上发布答案,而该问题的答案已经是两位数?特别是因为您的答案只是该答案的改写。
莉莉·巴拉德

6
因为我的回答是一行(使用内联类型转换-(int)),所以我认为这是OP可能想要的。我自己调查了一下,发现关于该主题的所有答案都是多行的。
塞缪尔·克莱

2
接受的答案演示了使用单行的隐式转换。Abizern的答案说明,如果您尝试使用NSInteger值代替,则会发生隐式转换int。在任何情况下,它都不是多线解决方案。
莉莉·巴拉德

25
我应该更清楚一点。由于这是一个新手问题,因此对于新手程序员而言,他们可以使用(int)表达式内联转换可能并不明显。其他答案未显示此内容,我认为这会帮助在此页面上迷路的任何人。
Samuel Clay

4
一年半以后,我偶然发现了此页面,需要专门与NSUInteger相关的演员表。谢谢,塞缪尔!
leanne

18

我不确定您需要将转换NSInteger为的情况int

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的充分理由:值比较。(int i = -1)>(NSUinteger j = 14)将int转换为unsigned,表示-1> 14,这不是您想要的。
塞缪尔·克莱

1
@SamuelClay。在特定情况下使用时的好处。就个人而言,我会将NSUInteger转换为uint。然而。问题是关于转换NSInteger,而不是NSUInteger。
阿比森

我仅使用unsigned int来说明常见的陷阱。正如我的答案所展示的,这两者都是相同的类型转换。这不是一个困难的问题,但这很常见,我还没有看到有人推荐单行答案。
塞缪尔·克莱

0

通常在UIsegmentedControl中使用,以64位而不是32位编译时会出现“错误”,不将其传递给新变量的简单方法是使用此技巧,添加(int)

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

代替 :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.