私はいくつかのエクササイズをしていて、次のような警告を受けています。
暗黙の変換は整数精度 'NSUInteger'(別名 'unsigned long')を 'int'に失います
私はかなりの能率があり、助けをいただければ幸いです。ありがとう。
#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;
}
count
のNSArray
メソッドはNSUInteger
を返し、64ビットOS Xプラットフォームでは
NSUInteger
はunsigned long
として定義され、unsigned long
は64ビットの符号なし整数です。int
は32ビット整数です。したがって、int
はNSUInteger
よりも「小さい」データ型であるため、コンパイラは警告を発します。
"Foundation Data Types Reference"の NSUInteger も参照してください。
32ビットアプリケーションを構築するとき、NSUIntegerは32ビット符号なし整数です。 64ビットアプリケーションは、NSUIntegerを64ビット符号なし整数として扱います。
このコンパイラの警告を修正するには、ローカルのcount
変数を次のように宣言します。
NSUInteger count;
または(あなたの配列が決して2^31-1
個以上の要素を含むことがないことが確実であるならば)、明示的なキャストを追加します:
int count = (int)[myColors count];
Martinの答えとは反対に、intにキャストすること(または警告を無視すること)は、配列に2 ^ 31-1個を超える要素がないことがわかっていても必ずしも安全ではありません。 64ビット用にコンパイルしているときは違います。
例えば:
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]);
}
「プロジェクト」>「ビルド設定」でキーを変更します。「printf/scanfへのタイプチェック呼び出し:NO」
説明:[仕組み]
Printfやscanfなどの呼び出しを調べて、指定された引数が指定されたフォーマット文字列に適した型であること、およびフォーマット文字列で指定された変換が意味をなすことを確認してください。
うまくいけば
その他の警告
客観的なCの暗黙的な変換は整数の精度 'NSUInteger'(別名 'unsigned long')を 'intに失います
キーを変更します。 "2ビットへの暗黙的な変換>デバッグ> * 64アーキテクチャ:いいえ"
[注意: 64ビットアーキテクチャ変換の他の警告を無効にするかもしれません]。
私の場合、「int」に明示的にキャストすることで問題は解決します。同じ問題がありました。そう:
int count = (int)[myColors count];