1. ホーム
  2. objective-c

[解決済み] Objective-Cの暗黙の変換で整数精度の「NSUInteger」(別名「unsigned long」)が「int」に変換されなくなる警告

2022-04-13 13:08:47

質問

練習問題を解いていたら、次のような警告が表示されました。

暗黙のうちに整数の精度を失う変換:'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 メソッドの NSArrayNSUInteger また、64ビットのOS Xプラットフォームでは

  • NSUInteger は次のように定義されます。 unsigned long であり、かつ
  • unsigned long は64ビットの符号なし整数である。
  • int は32ビット整数です。

そこで int よりも小さいデータ型です。 NSUInteger そのため、コンパイラの警告が表示されます。

参照 NSUInteger の「Foundation Data Types Reference"」にあります。

32ビットアプリケーションを構築する場合、NSUIntegerは32ビットの符号なし整数です。 整数です。64ビットアプリケーションでは、NSUIntegerは64ビット符号なし整数として扱われます。 の整数です。

このコンパイラの警告を修正するには、ローカルな count という変数があります。

NSUInteger count;

または (配列にそれ以上のものが含まれないと確信している場合) 2^31-1 の要素で構成されています!)。 明示的なキャストを追加します。

int count = (int)[myColors count];