到目前为止,我们所接触的数字类型,int型,float型,long型都是Objective-C语言中的基本数据类型,它们不是对象,也就是说,不能够向它们发送消息。然而有时需要将这些值作为对象使用。比如,使用Foundation的NSArray对象创建数组,它要求存储的值必须未对象,因此不能将基本数据类型直接存储到数组中。
NSNumber类可以根据数据的类型创建对象。
//声明对象与变量
NSNumber *myNumber, *floatNumber, *intNumber;
//integer 型
intNumber = [NSNumber numberWithInteger:100];
int i = intNumber.intValue;
NSLog(@"numberWithInteger:%i", i);
// long型
myNumber = [NSNumber numberWithLong:0xabcdef];
NSLog(@"numberWithLong:%li", myNumber.longValue);
// char 型
myNumber = [NSNumber numberWithChar:'A'];
NSLog(@"numberWithChar:%c", myNumber.charValue);
// float 型
floatNumber = [NSNumber numberWithFloat:0.333];
NSLog(@"numberWithFloat:%f", floatNumber.floatValue);
// double 型
myNumber = [NSNumber numberWithDouble:23.84888];
NSLog(@"numberWithDouble:%f", myNumber.doubleValue);
注:上面从NSNumber对象中获取值必须要和存储到NSNumber对象里面的数值类型一致.
//NSLog输出
2014-11-06 16:47:30.445 ObjectiveCLearn[10914:303] numberWithInteger:100
2014-11-06 16:47:30.446 ObjectiveCLearn[10914:303] numberWithLong:11259375
2014-11-06 16:47:30.446 ObjectiveCLearn[10914:303] numberWithChar:A
2014-11-06 16:47:30.446 ObjectiveCLearn[10914:303] numberWithFloat:0.333000
2014-11-06 16:47:30.447 ObjectiveCLearn[10914:303] numberWithDouble:23.848880
当然,现在Objective-c已经引入了ARC自动引用计数,可以方便的自动处理内存,所以我们也可以方便的使用初始化实例方法:
intWithChar:
intWithShort:
intWithInt:
intWithLong
intWithFloat:
......
//基本使用
NSNumber *number1 = [NSNumber numberWithFloat:3.14];
NSNumber *number2 = [NSNumber numberWithInt:10];
//比较两个数是否相等
if ([number1 isEqualToNumber:number2]) {
NSLog(@"number1 equal number2");
}else {
NSLog(@"numbers are not equal");
}
// 验证一个Number是否小于、等于或大于另一个Number
if ([number1 compare:number2] == NSOrderedAscending) {
NSLog(@"First number is less than second");
}
isEqualToNumber:比较两个NSNumber对象的数值,程序会返回BOOL值查看这两个值是否相等.
compure: 测试一个值是否在数值上小于、等于或者大于另外一个值,当number1小于number2的时候返回NSOrderedAscending,但两个值相等这返回NSOrderdSame,如果number2大于number1则返回NSOrderedDescending。
下面列举除了Api文档中对NSNumber的创建等方法,也可以查看一下NSDecimalNumber类的相关文档,它是NSNumber的子类,在对象层面上提供了一些数值的四则运算
<pre name="code" class="objc" style="font-size: 13.3333339691162px;">初始化NSNumber对象
<pre name="code" class="objc">- (id)initWithChar:(char)value;
- (id)initWithUnsignedChar:(unsigned char)value;
- (id)initWithShort:(short)value;
- (id)initWithUnsignedShort:(unsigned short)value;
- (id)initWithInt:(int)value;
- (id)initWithUnsignedInt:(unsigned int)value;
- (id)initWithLong:(long)value;
- (id)initWithUnsignedLong:(unsigned long)value;
- (id)initWithLongLong:(long long)value;
- (id)initWithUnsignedLongLong:(unsigned long long)value;
- (id)initWithFloat:(float)value;
- (id)initWithDouble:(double)value;
- (id)initWithBool:(BOOL)value;
- (id)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
- (id)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
<pre name="code" class="objc" style="font-size: 13.3333339691162px;">创建NSNumber对象
<pre name="code" class="objc">+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
// 检索实例方法 – boolValue– charValue– decimalValue– doubleValue– floatValue– intValue– integerValue– longLongValue– longValue– shortValue– unsignedCharValue– unsignedIntegerValue– unsignedIntValue– unsignedLongLongValue– unsignedLongValue– unsignedShortValue检索字符串表示形式– descriptionWithLocale:– stringValue比较NSNumber对象– compare:– isEqualToNumber:访问类型信息– objCType