——Java培训、Android培训、iOS培训、.Net培训——–
NSArray和NSDictionary中只能存放OC对象,不能存放int,float,double等基本数据类型。如果真想把基本数据放进数组或字典中,需要先将基本数据【包装】成OC对象
NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray和N
SDictionary中
//NSNumber的使用
//【好处】可以把基本数据类型存放到 数组和字典中
//如何使用NSNumber
//1)int --->NSNumber
int a = 12;
NSNumber *intObj = [NSNumber numberWithInt:a];
NSMutableArray *arr = [NSMutableArray arrayWithObject:intObj];
NSLog(@"%@",arr);
//2)float --->NSNumber
float b = 12.2f;
intObj = [NSNumber numberWithFloat:b];
[arr addObject:intObj];
NSLog(@"%@",arr);
//3)如果此时让数组中的两个元素相加
//显然arr[0]+arr[1]是不行的
//step1:取出数组的元素
//step2:把元素转换成基本数据类型的数据
NSNumber *ns1 = arr[0];
NSNumber *ns2 = arr[1];
int a1 = [ns1 intValue];
float b1 = [ns2 floatValue];
NSLog(@"a1 + b1 = %.2f",a1+b1);
//4)NSNumber简写方式
int c = 100;
//@(变量名)把基本数据类型转换成NSNumber对象
[arr addObject:@(c)];
//@(数值)把数值转换成NSNumber对象
[arr addObject:@14];
NSLog(@"%@",arr);
【打印结果】
2015-10-08 21:01:43.474 NSNumber的使用[8143:303] (
12
)
2015-10-08 21:01:43.477 NSNumber的使用[8143:303] (
12,
“12.2”
)
2015-10-08 21:01:43.478 NSNumber的使用[8143:303] a1 + b1 = 24.20
2015-10-08 21:01:43.479 NSNumber的使用[8143:303] (
12,
“12.2”,
100,
14
)
1)NSNumber是NSValue的子类,NSValue主要用来把指、CGRect结构体等包装成OC对象,以便存储。
2)一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存【任意类型的数据】,比如int、float、char,当然也可以是指pointers、structures 和objects 、ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合中,例如那些需要其他元素对象是的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是【不可枚举】的。
为了方便 【结构体】和NSValue的转换,Foundation提供了一下方法将结构体包装秤NSValue对象—–》存储结构体到集合中
//创建一个结构体,保存点
CGPoint p = CGPointMake(10, 19);
//创建一个矩形
CGRect r = CGRectMake(2, 2, 2, 2);
//创建一个size
CGSize s = CGSizeMake(2, 2);
NSMutableArray *ma = [NSMutableArray array];
//[ma addObject:p];报错,基本数据类型不能保存到数组中
//1)valueWithPoint 将point结构体转换成NSValue对象
NSValue *value = [NSValue valueWithPoint:p];
[ma addObject:value];
value = [NSValue valueWithRect:r];
[ma addObject:value];
value = [NSValue valueWithSize:s];
[ma addObject:value];
NSLog(@"%@",ma);
//2)将NSValue中的值去出来
NSValue *value2 = [ma lastObject];
NSSize ns = [value2 sizeValue];
NSLog(@"%@",NSStringFromSize(ns));
//3)把自定义的结构体存储到NSArray中
typedef struct {
int year;
int month;
int day;
}myDate;
myDate d = {2014,12,31};
//[ma addObject:d];报错,基本数据类型
//@encode(myDate)把myDate类型生成一个常量字符串描述
value2 = [NSValue valueWithBytes:&d objCType:@encode(myDate)];
[ma addObject:value2];
NSLog(@"%@",ma);
//4)把自定义结构体的值从数组中取出来
//getValue获取值
myDate d2;
[value2 getValue:&d2];
NSLog(@"%d-%d-%d",d2.year,d2.month,d2.day);
【打印结果】
2015-10-08 21:28:46.822 NSValue的使用[8732:303] (
“NSPoint: {10, 19}”,
“NSRect: {{2, 2}, {2, 2}}”,
“NSSize: {2, 2}”
)
2015-10-08 21:28:46.827 NSValue的使用[8732:303] {2, 2}
2015-10-08 21:28:46.829 NSValue的使用[8732:303] (
“NSPoint: {10, 19}”,
“NSRect: {{2, 2}, {2, 2}}”,
“NSSize: {2, 2}”,
“”
)
2015-10-08 21:28:46.831 NSValue的使用[8732:303] 2014-12-31