Je travaille sur quelques exercices et j'ai un avertissement qui dit:
la conversion implicite perd la précision de l'entier 'NSUInteger' (ou 'unsigned long') en 'int'
Je suis tout à fait le noob et apprécierais toute aide .. merci.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSArray *myColors;
int i;
int count;
myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
count = myColors.count; // <<< issue warning here
for (i = 0; i < count; i++)
NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
}
return 0;
}
La méthode count
de NSArray
renvoie un NSUInteger
, et sur la plate-forme OS X 64 bits
NSUInteger
est défini comme _unsigned long
_, etunsigned long
_ est un entier non signé de 64 bits.int
est un entier de 32 bits.Donc, int
est un type de données "plus petit" que NSUInteger
, d'où l'avertissement du compilateur.
Voir aussi NSUInteger dans la "Référence des types de données Foundation":
Lors de la création d'applications 32 bits, NSUInteger est un entier non signé 32 bits. Une application 64 bits traite NSUInteger comme un entier non signé 64 bits.
Pour résoudre cet avertissement du compilateur, vous pouvez déclarer la variable locale count
comme
_NSUInteger count;
_
ou (si vous êtes sûr que votre tableau ne contiendra jamais plus de _2^31-1
_ éléments!), ajoutez une conversion explicite:
_int count = (int)[myColors count];
_
Contrairement à la réponse de Martin, passer à int (ou ignorer l'avertissement) n'est pas toujours sûr, même si vous savez que votre tableau ne contient pas plus de 2 ^ 31-1 éléments. Pas lors de la compilation en 64 bits.
Par exemple:
NSArray *array = @[@"a", @"b", @"c"];
int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!
if (i == NSNotFound) {
// thought we'd get here, but we don't
NSLog(@"it's not here");
}
else {
// this is what actually happens
NSLog(@"it's here: %d", i);
// **** crash horribly ****
NSLog(@"the object is %@", array[i]);
}
Changer de clé dans Projet> Paramètre de construction "les appels de typecheck à printf/scanf: NO"
Explication: [Comment ça marche]
Vérifiez les appels à printf et scanf, etc., pour vous assurer que les arguments fournis ont des types appropriés à la chaîne de format spécifiée et que les conversions spécifiées dans la chaîne de format ont un sens.
J'espère que ça marche
Autre avertissement
La conversion implicite de l’objectif C perd la précision de l’entier 'NSUInteger' (ou 'unsigned long') en 'int
Clé de changement "conversion implicite en 32 bits Type> Débogage> * architecture 64: non"
[attention: Cela peut annuler un autre avertissement de conversion d'architecture 64 Bits] .
Faire la conversion explicite vers "int" résout le problème dans mon cas. J'ai eu le même problème. Alors:
int count = (int)[myColors count];