NSNumber
引入:
基本数据类型变为对象
例如使用基本数据类型:NSInteger a = 9;但是有时候使用基本数据类型是不方便的,比如说需要将基本类型变量装到数组里,但数组里装的都是对象的地址。或者放入字典中也不可行。
所以需要将基本数据类型变为对象,让我们能够装入数组或者字典当中,让我们能够给他们发送消息,即调用方法,如排序。
专门用来装基础数据类型的对象类NSNumber
NSNumber的对象可以是各种各样数字的内容。比如:
NSNumber * intNumber = [[NSNumber alloc] initWithInt:5]; // 整型
NSNumber * floatNumber = [[NSNumber alloc] initWithFloat:3.14f]; // 浮点型
NSNumber * doubleNumber = [[NSNumber alloc] initWithDouble:3.14]; // 双精度浮点型
NSNumber * charNumber = [[NSNumber alloc] initWithChar:'A']; // 字符型
等等……
注意:上面这几个对象是不同的对象。
NSNumber是一个类簇
有一些类聚合在一起形成了一些类簇,从表面上看来是一个类,实际上,它可以创建各种类的对象。可以通过NSNumber调用不同的初始化方法创造出不同的对象。
一个super类,一个与众不同的类,一个超级的类。
NSNumber和UIButton都是典型的类簇,虽然使用同一个类名,但是可以创建不同的对象。
举例:猫狗和动物。
NSNumber比较方法
NSNumber * intNumber1 = [[NSNumber alloc] initWithInt:5];NSNumber * intNumber2 = [[NSNumber alloc] initWithInt:6];
BOOL ret = [intNumber1 isEqualToNumber:intNumber2]; // 比较是否相等。
BOOL ret = [intNumber1 isEqualToNumber:charNumber];
// 比较是否相等(不同类型的对象也可以作比较)
除了比较是否相等之外,两个NSNumber对象也可以像普通的基本变量一样去比较它们的大小关系:
if([intNumber1 compare:intNumber2] == NSOrderedAscending){
NSLog(@"intNumber1 < intNumber2");
}else if([intNumber1 compare:intNumber2] == NSOrderedSame) {
NSLog(@"intNumber1 == intNumber2");
}else if([intNumber1 compare:intNumber2] == NSOrderedDescending) {
NSLog(@"intNumber1 > intNumber2");
}
获得原始的基本类型的数据
既然把基本的数据存到了对象当中,如果想获得原始的基本类型的数据:调用intNumber对象的intValue方法。
如:
NSLog(@"%d", [intNumber intValue]);
NSLog(@"%f", [floatNumber floatValue]);
NSLog(@"%f", [doubleNumber doubleValue]);
NSLog(@"%c", [charNumber charValue]);
更简洁的理解和使用方法
// 自动创建NSNumber对象,只要在数字前加一个@,
编译器将会识别出它是何种类型的数字(double,float,character,boolean等)
NSNumber * number = @123;// 获取对象的值
int value = [number intValue];