Objective-C と iPhone の開発は初めてで、浮動小数点値を NSMutableArray に格納しようとしていますが、そうすると、「addObject の引数 1 の型に互換性がありません」というエラーが表示されます。私は何を間違っていますか?数学計算を実行できる double の配列を作成しようとしています。
4 に答える
NSMutableArray はオブジェクトのみを保持するため、配列に NSNumber オブジェクトをロードする必要があります。各 NSNumber を作成して double を保持し、それを配列に追加します。おそらく、このようなものです。
NSMutableArray *array = [[NSMutableArray alloc] init];
NSNumber *num = [NSNumber numberWithFloat:10.0f];
[array addObject:num];
必要に応じて繰り返します。
辞書にはオブジェクトが必要なため、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 もあります。
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];