【问题标题】:How to convert An NSInteger to an int?如何将 NSInteger 转换为 int?
【发布时间】:2010-12-17 16:26:23
【问题描述】:

例如,当像这样将value 消息传递给NSInteger 实例时

[a value] 它会导致 EXC_BAD_ACCESS。

那么如何将NSInteger 转换为int

如果相关,则仅使用

【问题讨论】:

  • 你似乎很困惑。 [a value] 建议您期望 a 是一个对象,但目前它是一个 NSInteger 。 “转换”为 int 并不能解决这个问题。

标签: objective-c cocoa nsinteger


【解决方案1】:

塔达:

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

NSInteger 只不过是一个 32/64 位的整数。 (它将根据您运行的操作系统/平台使用适当的大小)

【讨论】:

  • 确切地说,我认为 NSInteger 在 32 位平台上是 int,在 64 位平台上是 long。
  • 我使用建议的“强制转换”收到警告:隐式转换失去整数精度:“NSUInteger”(又名“unsigned long”)到“int”
  • @djcj,是的,新 SDK 的答案不正确。我想。
  • 把 (int) 放在 NSInteger 前面不是更容易吗?例如,(int)myInteger 每当你想调用整数形式,这样你就不必创建一个新的变量。
  • @chandhooguy 你为什么要避免使用新变量?
【解决方案2】:

如果您想内联执行此操作,只需将 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 年发布一个答案,该问题已经获得了两位数的已接受答案的答案?尤其是因为您的答案只是对该答案的改写。
  • 因为我的答案是一行(使用内联类型转换 - (int)),我认为这是 OP 可能想要的。我自己调查了一下,发现关于这个主题的所有答案都是多行的。
  • 接受的答案演示了使用单行的隐式转换。 Abizern 的回答解释说,如果您尝试使用NSInteger 值代替int,则会发生隐式转换。在这两种情况下,它都不是多线解决方案。
  • 我应该更清楚。由于这是一个有点新手的问题,对于新手程序员来说,他们可以使用 (int) 表达式进行内联转换可能并不明显。其他答案没有显示这一点,我认为它可以帮助任何偶然发现此页面的人。
  • 一年半后我偶然发现了这个页面,特别需要与 NSUInteger 相关的演员表。谢谢,塞缪尔!
【解决方案3】:

我不确定您需要将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

您可以在任何使用int 的地方使用NSInteger 而无需转换它。

【讨论】:

  • 这是一个将 NSUinteger 转换为 int 的充分理由:值比较。 (int i = -1) > (NSUinteger j = 14) 将 int 转换为无符号数,即 -1 > 14,这不是你想要的。
  • @SamuelClay。在特定情况下使用时很好。就个人而言,我会将 NSUInteger 转换为 uint。然而。问题是关于转换 NSInteger,而不是 NSUInteger。
  • 我只使用了一个 unsigned int 来说明一个常见的陷阱。正如我的回答所证明的那样,两者的类型都相同。这不是一个难题,但它很常见,我还没有看到有人推荐单行答案。
【解决方案4】:

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

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

而不是:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多