web-dev-qa-db-fra.com

Avertissement: La conversion implicite perd la précision Integer dans xcode 6

Je sais que cela pourrait être un doublon, mais j'en ai environ 30 La conversion implicite perd la précision Integer warnings dans mon projet ios après la mise à jour de xcode en version 6.

Premier exemple:

NSArray * stations = [self stationsJSON][KEY_ITEM_LIST];

int newSize = (stations.count + 1); // Implicit conversion loses Integer precision: 'unsigned long' to 'int'

Deuxième exemple:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    int index = indexPath.row / 2; // Implicit conversion loses Integer precision: 'long' to 'int'
    ...
}

Je sais ce que signifie l'avertissement. L'utilisation de NSInteger peut aider à éviter cet avertissement. 

Je ne comprends pas, pourquoi il n'y avait aucun avertissement dans xcode 5 ? Et pourquoi il n'y a pas d'avertissement après avoir changé de ligne 

int index = indexPath.row / 2;

à 

int index = indexPath.row / 2i;
15
dit

NSArray count est NSUInteger.

NSIndexPath row est NSInteger.

Sur les systèmes 64 bits, NSUInteger et NSInteger sont 64 bits, mais int est 32 bits. Donc, la valeur ne convient pas, ce qui entraîne l'avertissement.

Il vaut mieux éviter int dans iOS. Au lieu de cela, utilisez le même type que les valeurs que vous traitez.

NSInteger index = indexPath.row / 2;

Vous les verrez probablement dans Xcode 6 en raison des avertissements par défaut. Vous pouvez facilement les voir dans Xcode 5 avec les paramètres d'avertissement appropriés et la construction pour 64 bits.

22
rmaddy

Vous pouvez mettre à jour les paramètres du projet, pour supprimer tout 

Implicit conversion loses integer precision avertissements, en réglant 

Implicit Conversion to 32 Bit Type à No 

dans les paramètres de construction du projet.

enter image description here

35
Vitaliy Gozhenko

Ces avertissements m'ennuyaient toujours et j'ai donc trouvé une solution simple pour l'éviter:

@interface NSIndexPath(UnsignedIndex)

@property (nonatomic, readonly) NSUInteger sectionIndex;
@property (nonatomic, readonly) NSUInteger rowIndex;

@end

@implementation NSIndexPath(UnsignedIndex)

- (NSUInteger)sectionIndex {

    return (NSUInteger)self.section;
}

- (NSUInteger)rowIndex {

    return (NSUInteger)self.row;
}

@end

Utilisez simplement les propriétés rowIndex et sectionIndex de cette catégorie au lieu des propriétés de ligne et de section de NSIndexPath.

0
Matthes