将NSIntegervariables传递给NSMutableDictionary或NSMutableArray
为什么这不起作用:
NSInteger temp = 20; [userSettingsFromFile setObject:temp forKey:@"aTemp"];
但是这样做:
[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];
我怎样才能使用NSInteger
variables?
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
类派生,但它必须符合定义retain
和release
的NSObject
协议。
这可能会让人困惑,但是类和协议有不同的名字空间。 有一个名为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