2017-06-08 6 views
0

私のアプリケーションの64ビットサポートに更新しようとしているメソッドがあります。私はこれらの多くを持っていますwarnings32ビットメソッドを64ビットサポートに適切に更新する

問題は次の例のとおりです。私はNSIntegerに戻り値の型を変更した場合、私はの実装で戻り値の型を競合

取得

- (int) aMethod { 
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults]; 
    return [u integerForKey:@"someKey"]; 
} 

をintに

暗黙的な変換が失われる整数精度NSInteger:私は警告を受けますaMethod intとNSInteger long long

-(NSInteger) aMethod { 
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults]; 
    return [u integerForKey:@"someKey"]; 
} 

私は戻り値の型

return (NSInteger)[u integerForKey:@"someKey"];

または

return (long)[u integerForKey:@"someKey"];

をキャストしようとしている。しかし、私は(int型)にキャストしない限り、私はエラーが離れて行くために得ることができません

return (int)[u integerForKey:@"someKey"];

私は多くのSOの質問を読みましたが、私は良い答えを得ることができません。

このメソッドを更新する適切な方法は何ですか?

+0

' - (NSInteger)aMethod {'を使うと、.hファイルの署名も更新しますか? (...または宣言された他の場所) –

+0

あなたはそうです。 .hファイルを更新するのを忘れた* facepalm * –

答えて

0

方法:

- (int) aMethod ... 

タイプintの値を返します。このメソッドは、おそらくヘッダー(.h)ファイルで宣言された後、実装ファイル(.m)で定義されます。

声明:

return [u integerForKey:@"someKey"]; 

はタイプNSIntegerの値であるintegerForKey:を呼び出した結果を返します。 NSInteger

は(Objective-)C 言語によって定義されたタイプではなく、むしろそれは、プラットフォームの「天然」の整数サイズを表すことを意図フレームワークで定義さ型エイリアスtypedef)であります。これは、32ビットプラットフォームの場合はint、64ビットの場合はlongのエイリアスです。

コンパイルエラーは、(現在)64ビットの値が32ビットの結果に収まるように切り捨てられていることを示しています。この問題を解決するために単一の正しい方法は、それが@someKeyに関連付けられた値を使用することが何であるかに依存して、存在しません:

  • 値は、現在の64ビットは、その後aMethodの戻り値の型を変更する必要がある場合。それが別に宣言されていれば宣言されています。 NSIntegerNSIntegerの値を返すメソッドが受け入れられるかどうかをチェックする必要があります。また、変数のタイプなどを後で変更する必要があるかもしれません。また、キーに関連付けられた値がセット。
  • キーに関連付けられた値が32ビットのまま残っている場合は、integerForKeyの代わりにintForKey:を使用し、戻り値の形式をそのままにしておくことができます。また、キーがint

HTH

修正

を保存するように設定されている(もはや?)がありNSUserDefaultsに便利なメソッドintForKey:は変わらないはずです。代わりに、integerForKey:とキャスト;参照番号NSNumberを取得し、次にintValueを得るためにobjectForKey:

関連する問題