web-dev-qa-db-ja.com

浮動小数点値のNSMutableArrayを作成する方法

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

30
Jon

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

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

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

62
Ryan Townshend

辞書にはオブジェクトが必要なので、NSNumberを使用してフロートをラップします。

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

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

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

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

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

12
Sijmen Mulder

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];
7
Jason Coco
NSMutableArray *muArray = [[NSMutableArray alloc] init];
NSNumber *float = [NSNumber numberWithFloat:210.0f];
NSNumber *float1 = [NSNumber numberWithFloat:211.0f];
[muArray addObject:float];
[muArray addObject:float1];

NSlog(@"my array is--%@",muArray);
1
Sanjay Kakadiya