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