将NSInteger变量传递给NSMutableDictionary或NSMutableArray

时间:2009-08-27 07:24:04

标签: objective-c iphone

为什么这不起作用:

NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];

但这样做:

[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];

如何使用NSInteger变量?

7 个答案:

答案 0 :(得分:91)

NSInteger不是一个对象 - 它只是对32位int或64位long进行类型转换。由于NSDictionary只能存储对象,因此需要先将整数包装到对象中,然后才能存储它。试试这个:

NSInteger temp = 20;
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] 
                         forKey:@"aTemp"]; 

答案 1 :(得分:5)

为了在集合中存储数字,您必须将它们包装在NSNumber实例中。

double aDouble = 20.3d;
NSInteger anInt = 20;

NSNumber *aWrappedDouble = [NSNumber numberWithDouble:aDouble];
NSNumber *aWrappedInt = [NSNumber numberWithInteger:anInt];

NSArray *anArray = [NSArray arrayWithObjects:aWrappedDouble, aWrappedInt, nil];

答案 2 :(得分:2)

无论你通过setObject传递什么,都必须从NSObject派生。 NSInteger不是,它是一个简单的int typedef。在您的第二个示例中,您使用NSStringNSObject来自{{1}}。

答案 3 :(得分:1)

NSInteger是长整数的同义词。以下是NSInteger的定义:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

NSNumber是一个Objective-C类,NSValue的子类是特定的。您可以使用有符号或无符号字符创建NSNumber对象,short int,int,long int,long long int,float,double或BOOL

主要区别之一是您可以在需要对象的集合(例如NSArray)中使用NSNumber。例如,如果需要向NSArray添加浮点数,首先需要从浮点数创建一个NSNumber对象:

float percentage = 40.5;

... //创建NSNumber对象,现在可以插入NSArray

NSNumber *percentageObject = [NSNumber numberWithFloat:percentage];

答案 4 :(得分:0)

更正:通过setObject:传递的任何内容都不必从NSObject类派生,但它必须符合NSObject协议,该协议定义retainrelease

它可能令人困惑,但类和协议具有不同的名称空间。并且有一个类和一个名为NSObject的协议,类NSObject符合协议NSObject。还有一个根类,NSProxy类也符合NSObject协议。

这很重要,因为其他代理无法在集合和自动释放池中使用,同时仍然具有轻量级代理根类。

答案 5 :(得分:0)

提到@Matt Ball的答案:NSInteger不是一个对象 - 它简单地在32位上对int进行类型转换,在64位上进行长整型。由于NSDictionary只能存储对象,因此需要先将整数包装到对象中,然后才能存储它。

因此,在 Swift 的情况下,您就是这样做的:

let temp:NSInteger = yourInteger.hashValue

答案 6 :(得分:-1)

只需使用:$(variable)语法将基本类型转换为对象。