Avertissement "La conversion implicite perd la précision entière ..."
Je suis en train de faire un panier tutoriel: j'ai un tableau qui recueille de l'entrée d'un champ de texte, puis l'affiche dans le NSTableView. Vous pouvez vérifier un élément, et l'enlever de la liste. Je veux afficher un avertissement que si quelque chose est cochée. Donc, j'ai ceci:
-(IBAction)removeItemFromShoppingList:(id)sender {
int selectedItemIndex = [shoppingListTableView selectedRow];
if (selectedItemIndex == -1) return;
NSAlert *alert = [[NSAlert alloc] init];
...
[alert runModal];
[alert release];
}
Sur la ligne 2 ( int selectedItemIndex...
), je reçois un avertissement jaune: conversion Implicite perd entier précision:’NSInteger’ (aka "long") à "int".
Pourquoi?
source d'informationauteur janeh
Vous devez vous connecter pour publier un commentaire.
De la documentation d'apple:
Mise à JOUR:
Expliquer dans le détail:
[shoppingListTableView selectedRow]
renvoie une NSInteger, et vous devez construire une application 64 bits, il est en fait unlong
.Vous pouvez utiliser
long selectedItemIndex
au lieu deint selectedItemIndex
pour supprimer cette alerte, mais l'avertissement s'affiche à nouveau lors de la construction de la version 32 bits.Une meilleure façon est d'utiliser
NSInteger selectedItemIndex
qui gère ce dossier correctement.Parce que votre variable est de type
int
et vous essayez de copier la valeur d'une variable de typeNSInteger
. UnNSInteger
peut contenir de plus grandes valeurs qu'uneint
pouvez, si vous obtenez un avertissement que le dépassement est possible. Probablement la solution la plus simple est de changerint
àNSInteger
. (Lorsque vous souhaitez copier la valeur d'une variable pour l'exécution des tests sur elle, vous devez généralement utiliser une variable du même type.)Utilisation
Au lieu de
La selectedRow: méthode renvoie une valeur de type NSInteger.
Vous devriez faire de votre selectedItemIndex de type NSInteger.
Veuillez vous référer à:
Utilisation
Au lieu de
Vous pouvez mettre à jour les paramètres du projet, pour supprimer toutes les
Implicit conversion loses integer precision
mises en garde, par la mise enImplicit Conversion to 32 Bit Type
àNo
dans le projet de construction de paramètres.
Je sors d'avertissement juste à faire: