【发布时间】:2010-10-04 09:01:15
【问题描述】:
我是 Objective-C 和 iPhone 开发的新手,我正在尝试将浮点值存储在 NSMutableArray 中,但是当我这样做时,我收到一条错误消息,提示“'addObject 的参数 1 的类型不兼容”。我究竟做错了什么?我正在尝试创建一个可以用来执行数学计算的双精度数组。
【问题讨论】:
标签: iphone objective-c arrays double
我是 Objective-C 和 iPhone 开发的新手,我正在尝试将浮点值存储在 NSMutableArray 中,但是当我这样做时,我收到一条错误消息,提示“'addObject 的参数 1 的类型不兼容”。我究竟做错了什么?我正在尝试创建一个可以用来执行数学计算的双精度数组。
【问题讨论】:
标签: iphone objective-c arrays double
使用 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。
【讨论】:
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);
【讨论】:
NSMutableArray 仅保存对象,因此您希望使用 NSNumber 对象加载数组。 创建每个 NSNumber 来保存你的双精度然后将它添加到你的数组中。也许是这样的。
NSMutableArray *array = [[NSMutableArray alloc] init];
NSNumber *num = [NSNumber numberWithFloat:10.0f];
[array addObject:num];
根据需要重复。
【讨论】:
在 Cocoa 中,NSMutableDictionary(以及所有的集合,真的)需要对象作为值,因此您不能简单地传递任何其他数据类型。正如 sjmulder 和 Ryan 建议的那样,您可以将标量值包装在 NSNumber(用于数字)和 NSValue 用于其他对象的实例中。
如果您代表十进制数字,例如价格,我建议您也查看并使用NSDecimalNumber。然后,您可以避免浮点不准确问题,并且通常可以将“值”作为NSDecimalNumber 使用和存储,而不是用代码中的原语表示。
例如:
// somewhere
NSDecimalNumber* price = [[NSDecimalNumber decimalNumberWithString:@"3.50"] retain];
NSMutableArray* prices= [[NSMutableArray array] retain];
// ...
[prices addObject:price];
【讨论】: