2016-01-30 1 views
0

j'utilise JSONModel pour capturer des données de JSON:Questions sur NSUInteger et int

@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 

Et je le code suivant:

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++; 
    } 
} 

En fait StationIndex est un entier 1 ou 2 chiffres. Par exemple j'ai self.campusBusArray[i][@"StationIndex"] == 4, et j'ai index == 4, puis les deux NSLog tous sortie 4, mais il ne sautera pas dans le bloc if, ou le numberOfBusesCurrentlyAtThisStation++ ne sera pas exécuté. Quelqu'un peut-il me dire pourquoi?

Répondre

1

permet de regarder la ligne:

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

%@ dit qu'un objet sera inclus dans le journal, qui met en œuvre description. C'est bien, car la fin de l'expression déréférence un dictionnaire, qui ne peut contenir que des objets.

NSUInteger, comme int est un type scalaire. Comme C démodé, c'est juste un groupe d'octets en mémoire dont la valeur est la valeur numérique de ces octets. Un objet, même celui qui représente un nombre, comme NSNumber ne peut pas être casté en utilisant le cast de style c (de plus, la précédence de la distribution est faible, cette expression ne fait que lancer self, aussi absurde).

Il semble donc que self.campusBusArray est un tableau de dictionnaires (probablement le résultat de l'analyse JSON décrivant un tableau d'objets). Et il semble que vous vous attendez à ce que ces dictionnaires aient une clé appelée [@"StationIndex"] avec une valeur numérique. Que doit être un NSNumber par les règles des collections d'objectifs-c (ils contiennent des objets). Par conséquent:

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 
} 

Ce dernier test en ligne pour voir du pointeur à un objet (une adresse en mémoire) est égal à 4. Faire des mathématiques scalaire, ou des moulages sur, ou des comparaisons sur les pointeurs d'objet presque jamais logique.

Réécriture ...

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++; 
    } 
} 
+0

Un grand merci! Maintenant, j'ai trouvé que j'ai fait cette erreur parce que j'ai oublié la valeur dans un dictionnaire doit être un objet, donc un NSUInteger sera encadré dans un NSNumber. Merci encore! – Caesar