为什么这不起作用:
NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];
但这样做:
[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];
如何使用NSInteger
变量?
答案 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。在您的第二个示例中,您使用NSString
,NSObject
来自{{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
协议,该协议定义retain
和release
。
它可能令人困惑,但类和协议具有不同的名称空间。并且有一个类和一个名为NSObject
的协议,类NSObject
符合协议NSObject
。还有一个根类,NSProxy
类也符合NSObject
协议。
这很重要,因为其他代理无法在集合和自动释放池中使用,同时仍然具有轻量级代理根类。
答案 5 :(得分:0)
提到@Matt Ball的答案:NSInteger不是一个对象 - 它简单地在32位上对int进行类型转换,在64位上进行长整型。由于NSDictionary只能存储对象,因此需要先将整数包装到对象中,然后才能存储它。
因此,在 Swift 的情况下,您就是这样做的:
let temp:NSInteger = yourInteger.hashValue
答案 6 :(得分:-1)
只需使用:$(variable)
语法将基本类型转换为对象。