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;
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.
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.
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.