我试图找出将NSUInteger转换为适用于32位和64位系统的字符串的最佳方法。我看到两个平台的NSUInteger定义不同,我想确保我所做的是正确的。
我见过的所有解决方案都需要一些铸造,或者看起来不正确。我收到一个警告,下面的代码要求我添加一个明确的演员。
NSUInteger unsignedInteger = PostStatusFailed; // This is an enum
NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];
我也尝试了%d
(签名的ints,这似乎不正确)和%lx
,但似乎都没有。感谢。
答案 0 :(得分:6)
OS X使用多种数据类型 -
NSInteger
,NSUInteger
,CGFloat
和CFIndex
- 提供一致的方法来代表32- 和64位环境。在32位环境中,NSInteger
和NSUInteger
分别定义为int
和unsigned int
。在 64位环境NSInteger
和NSUInteger
定义为long
和 分别为unsigned long
。避免使用不同的需要 printf样式类型说明符取决于平台,您可以使用 表3中显示的说明符。请注意,在某些情况下,您可能有 投下价值。
查看所有类型的链接。对于NSUInteger
,正确的方法是:
NSUInteger i = 42;
NSString *numberString = [NSString stringWithFormat:@"%lu is the answer to life, the universe, and everything.", (unsigned long)i];
答案 1 :(得分:-1)
编译64位运行时时,编译器会定义 LP64 宏。
所以你可以这样做:
#if __LP64__
NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];
#else
NSString *string = [NSString stringWithFormat:@"postStatus == %u", unsignedInteger];
#endif
答案 2 :(得分:-1)
在32位环境中,NSInteger和NSUInteger分别定义为int和unsigned int。在64位环境中,NSInteger和NSUInteger分别定义为long和unsigned long。
所以有一个NSNumber以获得最佳方式。
当你想要获得一个NSString时,就像这个格式化为NSNumber那样。
NSUInteger unsignedInteger = PostStatusFailed; // This is an enum
NSString *string = [NSString stringWithFormat:@"postStatus == %@", @(unsignedInteger)];
%@ ---> @(NSUInteger),你看@(),它是一个NSNumber。