30

Objective-C と iPhone の開発は初めてで、浮動小数点値を NSMutableArray に格納しようとしていますが、そうすると、「addObject の引数 1 の型に互換性がありません」というエラーが表示されます。私は何を間違っていますか?数学計算を実行できる double の配列を作成しようとしています。

4

4 に答える 4

63

NSMutableArray はオブジェクトのみを保持するため、配列に NSNumber オブジェクトをロードする必要があります。各 NSNumber を作成して double を保持し、それを配列に追加します。おそらく、このようなものです。

NSMutableArray *array = [[NSMutableArray alloc] init];
NSNumber *num = [NSNumber numberWithFloat:10.0f];
[array addObject:num];

必要に応じて繰り返します。

于 2009-01-29T22:55:15.937 に答える
12

辞書にはオブジェクトが必要なため、NSNumber を使用して float をラップします。

[myDictionary setObject:[NSNumber numberWithFloat:0.2f] forKey:@"theFloat"];
/* or */
[myDictionary setObject:@0.2f forKey:@"theFloat"];

floatValue を送信して取得します。

float theFloat = [[myDictionary objectForKey:@"theFloat"] floatValue];

コードはテストされていません。

NSNumber で他の多くのデータ型をラップすることもできます。ドキュメントを確認してください。NSPoint や NSRect などの一部の構造には NSValue もあります

于 2009-01-29T22:52:34.710 に答える
7

Cocoa では、NSMutableDictionary (および実際にはすべてのコレクション) が値としてオブジェクトを必要とするため、他のデータ型を単純に渡すことはできません。sjmulder と Ryan の両方が示唆したように、スカラー値を NSNumber (数値の場合) および NSValue のインスタンスで他のオブジェクトにラップできます。

価格のようなもので 10 進数を表している場合は、NSDecimalNumberも見て使用することをお勧めします。これにより、浮動小数点の不正確さの問題を回避できます。通常、「値」をコード内のプリミティブで表す代わりに、 NSDecimalNumberとして使用および保存できます。

例えば:

// somewhere
NSDecimalNumber* price = [[NSDecimalNumber decimalNumberWithString:@"3.50"] retain];
NSMutableArray*  prices= [[NSMutableArray array] retain];

// ...

[prices addObject:price];
于 2009-01-29T23:03:06.110 に答える