将NSIntegervariables传递给NSMutableDictionary或NSMutableArray

为什么这不起作用:

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

但是这样做:

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

我怎样才能使用NSIntegervariables?

NSInteger不是一个对象 – 它只是简单地将int转换为32位或64位的long 。 由于NSDictionary只能存储对象,因此在存储对象之前,需要将整数封装到对象中。 尝试这个:

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

为了在集合中存储数字,你必须把它们包装在一个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]; 

无论你通过setObject传递什么,都必须从NSObject派生。 NSInteger不是,这是一个简单的int typedef。 在你的第二个例子中,你使用从NSObject派生的NSString

更正:无论通过setObject:传递什么setObject:不必从NSObject类派生,但它必须符合定义retainreleaseNSObject协议。

这可能会让人困惑,但是类和协议有不同的名字空间。 有一个名为NSObject的类和一个协议,类NSObject符合协议NSObject 。 还有一个根类, NSProxy类也符合NSObject协议。

这很重要,因为否则代理不能在集合和自动发布池中使用,而仍然具有轻量级的代理根类。

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的一个子类是特定的。 您可以从一个有符号或无符号的字符,短整型,整型,长整型,long long int,float,double或BOOL创build一个NSNumber对象

其中一个主要的区别是,你可以在集合中使用NSNumber,比如需要对象的NSArray。 例如,如果你需要在一个NSArray中添加一个float,你首先需要从float中创build一个NSNumber对象:

 float percentage = 40.5; 

… / /创buildNSNumber对象,现在可以插入到一个NSArray

 NSNumber *percentageObject = [NSNumber numberWithFloat:percentage]; 

只需使用: $(variable)语法将原始types转换为对象。

提到@Matt Ball的回答:NSInteger不是一个对象 – 它只是简单地在32位或32位长整型。 由于NSDictionary只能存储对象,所以在存储对象之前,需要将整数包装到一个对象中。

所以,在Swift的情况下,这是你如何做到的:

 let temp:NSInteger = yourInteger.hashValue