关于 NSUinteger 和 int 的问题
Questions about NSUinteger and int
我使用 JSONModel 从 json:
捕获数据
@interface BBTCampusBus : JSONModel
@property (strong, nonatomic) NSString * Name;
@property (assign, nonatomic) NSUInteger Latitude;
@property (assign, nonatomic) NSUInteger Longitude;
@property (nonatomic) BOOL Direction;
@property (assign, nonatomic) NSUInteger Time;
@property (nonatomic) BOOL Stop;
@property (strong, nonatomic) NSString * Station;
@property (assign, nonatomic) NSInteger StationIndex;
@property (assign, nonatomic) NSUInteger Percent;
@property (nonatomic) BOOL Fly;
@end
我有以下代码:
for (int i = 0;i < [self.campusBusArray count];i++)
{
NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);
NSLog(@"index - %lu", index);
if ([(NSUInteger)self.campusBusArray[i][[@"StationIndex"] ]== index)
{
numberOfBusesCurrentlyAtThisStation++;
}
}
其实StationIndex
是一个1位或2位的整数。比如我有self.campusBusArray[i][@"StationIndex"]
== 4,我有index
== 4,那么两个NSLog都输出4,但是不会跳转到if块,或者numberOfBusesCurrentlyAtThisStation++
不会被执行。有人可以告诉我为什么吗?
让我们看一下这行:
NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);
%@
表示一个对象将被包含在日志中,一个实现description
的对象。这很好,因为表达式的末尾取消引用了一个可能只包含对象的字典。
NSUInteger
,就像 int
是一个 scalar 类型。和老式的C一样,它只是内存中的一组字节,其值就是这些字节的数值。一个对象,即使是代表数字的对象,比如 NSNumber
也不能使用 c 风格的强制转换(而且强制转换的优先级很低,这个表达式真的只是强制转换 self
,也是无意义的) .
所以看起来self.campusBusArray
是一个字典数组(可能是解析JSON描述对象数组的结果)。看起来您希望这些词典有一个名为 [@"StationIndex"]
的键和一个数值。根据 objective-c 集合(它们包含对象)的规则, 必须 是一个 NSNumber
。因此:
NSDictionary *aCampusBusObject = self.campusBusArray[i]; // notice no cast
NSNumber *stationIndex = aCampusBusObject[@"StationIndex"]; // this is an object
NSUInteger stationIndexAsInteger = [stationIndex intValue]; // this is a simple, scalar integer
if (stationIndexAsInteger == 4) { // this makes sense
}
if (stationIndex == 4) { // this makes no sense
}
最后一行测试 指向对象的指针 (内存中的地址)是否等于 4。进行标量数学运算、强制转换或比较对象指针几乎没有意义。
重写...
for (int i = 0;i < [self.campusBusArray count];i++)
{
NSDictionary *aCampusBusObject = self.campusBusArray[i];
NSNumber *stationIndex = aCampusBusObject[@"StationIndex"];
NSUInteger stationIndexAsInteger = [stationIndex intValue];
NSLog(@"index at nsuinteger - %lu", stationIndexAsInteger);
NSLog(@"index - %lu", index);
if (stationIndexAsInteger == index)
{
numberOfBusesCurrentlyAtThisStation++;
}
}
我使用 JSONModel 从 json:
捕获数据@interface BBTCampusBus : JSONModel
@property (strong, nonatomic) NSString * Name;
@property (assign, nonatomic) NSUInteger Latitude;
@property (assign, nonatomic) NSUInteger Longitude;
@property (nonatomic) BOOL Direction;
@property (assign, nonatomic) NSUInteger Time;
@property (nonatomic) BOOL Stop;
@property (strong, nonatomic) NSString * Station;
@property (assign, nonatomic) NSInteger StationIndex;
@property (assign, nonatomic) NSUInteger Percent;
@property (nonatomic) BOOL Fly;
@end
我有以下代码:
for (int i = 0;i < [self.campusBusArray count];i++)
{
NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);
NSLog(@"index - %lu", index);
if ([(NSUInteger)self.campusBusArray[i][[@"StationIndex"] ]== index)
{
numberOfBusesCurrentlyAtThisStation++;
}
}
其实StationIndex
是一个1位或2位的整数。比如我有self.campusBusArray[i][@"StationIndex"]
== 4,我有index
== 4,那么两个NSLog都输出4,但是不会跳转到if块,或者numberOfBusesCurrentlyAtThisStation++
不会被执行。有人可以告诉我为什么吗?
让我们看一下这行:
NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);
%@
表示一个对象将被包含在日志中,一个实现description
的对象。这很好,因为表达式的末尾取消引用了一个可能只包含对象的字典。
NSUInteger
,就像 int
是一个 scalar 类型。和老式的C一样,它只是内存中的一组字节,其值就是这些字节的数值。一个对象,即使是代表数字的对象,比如 NSNumber
也不能使用 c 风格的强制转换(而且强制转换的优先级很低,这个表达式真的只是强制转换 self
,也是无意义的) .
所以看起来self.campusBusArray
是一个字典数组(可能是解析JSON描述对象数组的结果)。看起来您希望这些词典有一个名为 [@"StationIndex"]
的键和一个数值。根据 objective-c 集合(它们包含对象)的规则, 必须 是一个 NSNumber
。因此:
NSDictionary *aCampusBusObject = self.campusBusArray[i]; // notice no cast
NSNumber *stationIndex = aCampusBusObject[@"StationIndex"]; // this is an object
NSUInteger stationIndexAsInteger = [stationIndex intValue]; // this is a simple, scalar integer
if (stationIndexAsInteger == 4) { // this makes sense
}
if (stationIndex == 4) { // this makes no sense
}
最后一行测试 指向对象的指针 (内存中的地址)是否等于 4。进行标量数学运算、强制转换或比较对象指针几乎没有意义。
重写...
for (int i = 0;i < [self.campusBusArray count];i++)
{
NSDictionary *aCampusBusObject = self.campusBusArray[i];
NSNumber *stationIndex = aCampusBusObject[@"StationIndex"];
NSUInteger stationIndexAsInteger = [stationIndex intValue];
NSLog(@"index at nsuinteger - %lu", stationIndexAsInteger);
NSLog(@"index - %lu", index);
if (stationIndexAsInteger == index)
{
numberOfBusesCurrentlyAtThisStation++;
}
}