关于NSUinteger和int

时间:2016-01-30 02:19:45

标签: objective-c int jsonmodel nsuinteger

我使用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++不会被执行。有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

让我们看看这一行:

NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);

%@表示对象将包含在日志中,实现description。这很好,因为表达式的结尾取消引用了一个字典,它可能只包含对象。

NSUInteger,与int类似,是标量类型。与老式的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++;
    }
}