如何将一个 NSInteger 转换为 int?

101
例如,当将一个值消息传递给一个 NSInteger 实例时,像这样 [a value] 会导致 EXC_BAD_ACCESS 错误。
那么如何将 NSInteger 转换为 int?
如果只涉及到小于 32 的小数,那么如何处理?

2
你似乎有些困惑。[一个值]表明你期望a是一个对象,但它目前是一个NSInteger。将其“转换”为int并不能解决这个问题。 - Mike Abdullah
4个回答

214

瞧,完成了:

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

NSInteger本质上就是一个32/64位的整数(它将根据您运行的操作系统/平台使用相应的大小)。


13
准确来说,我认为在32位平台上,NSInteger是整型 int,在64位平台上则是长整型 long。 - Frederic Adda
5
使用建议的“强制类型转换”时,我收到了一个警告:隐式转换导致整数精度丢失:'NSUInteger'(又名 'unsigned long')到 'int'。 - djcj
@djcj,是的,对于新的SDK,答案不正确。我认为。 - Nazik
把 (int) 放在 NSInteger 前面不是更容易吗?例如,每当你想调用整数形式时,使用 (int)myInteger,这样你就不必创建一个新变量。 - chandhooguy
2
@chandhooguy 为什么你要避免使用一个新变量? - Dan Rosenstark

27
如果您想要内联执行此操作,只需将NSUIntegerNSInteger转换为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
只是出于好奇,为什么您要在一个已经有被接受的答案和双位数投票的问题上发布一个回答,而且您的回答只是那个答案的改述? - Lily Ballard
6
因为我的答案只有一行代码(使用内联类型转换——(int)),我认为这可能是提问者想要的。我自己也研究了这个问题,注意到所有相关的回答都是多行代码。 - Samuel Clay
3
被接受的答案展示了使用单行代码的隐式转换。Abizern的回答解释了如果你试图在一个int的位置使用NSInteger值,就会发生隐式转换。在这两种情况下都不是多行解决方案。 - Lily Ballard
25
我应该表达得更清楚一些。由于这是一个比较初级的问题,对于新手程序员来说,可能不太明显他们可以使用 (int) 表达式进行内联转换。其他答案没有展示这个方法,但我认为它对于偶然浏览到这个页面的任何人都有帮助。 - Samuel Clay
4
一年半后,我又偶然发现了这个页面,特别需要与_NUInteger_相关的转换。谢谢,塞缪尔! - leanne
最流行的答案是一行代码:(int) myInteger - 令人惊讶的是,我们需要三种不同的数据类型来表示整数! - John

18

我不确定在何种情况下需要将NSInteger转换为int

NSInteger只是一个类型定义:

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

您可以在不进行转换的情况下,在任何使用int的地方使用NSInteger


2
想要将NSUinteger转换为int的一个好理由是:值比较。(int i = -1) > (NSUinteger j = 14)会将int转换为无符号整数,这意味着-1 > 14,这不是你想要的结果。 - Samuel Clay
1
@SamuelClay。在特定情况下使用是个好方法。就我个人而言,我会将NSUInteger转换为uint。然而,问题是关于如何转换NSInteger,而不是NSUInteger。 - Abizern
我只是使用了一个无符号整数来说明一个常见的陷阱。正如我的答案所示,它们都是相同的类型转换。这不是一个困难的问题,但它很常见,我还没有看到有人推荐一种单行回答。 - Samuel Clay

-1

在UIsegmentedControl中常用的方法,在64位编译时出现“错误”,不需要将其传递到新变量的简单方法是使用此提示,添加(int)

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

而不是:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接