版本
Xcode 8.2.1
一、NSNumber
前文说过,NSArray和NSDictionary只能存入OC对象。不信我们可以做个试验:将一个int类型或者是NSInteger放入NSMutableArray里面。(NSInteger和int的差别:NSInteger会根据系统的位数32or64,自动选择int的最大数值int or long,这样我们就不用考虑设备是32位还是64位系统)
NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObject:100]; //编译出错
这样是会编译出错的,存入不成功。
那怎么办呢?所以,我们需要将int或者NSInteger类型转换成NSNumber(OC对象),然后再存入NSArray中。
NSNumber可以转换一系列的基础数字类型(char、int、float、long、bool等等),还提供了一个compare方法来将NSNumber对象进行数值排序。
我们来看看NSNumber有哪些要掌握的知识点:
NSInteger num = 100;
CGFloat f = 3.33;
BOOL flag = YES;
//C的基本类型转换成NSNumber对象
NSNumber *numInte = [NSNumber numberWithInteger:num];
NSNumber *numFlo = [NSNumber numberWithFloat:f];
NSNumber *numBool = [NSNumber numberWithBool:flag];
NSLog(@"numInteger = %@, numFloat = %@, numBool = %@",numInte,numFlo,numBool);
//NSNumber转换成C的基本类型
NSInteger resultNum = [numInte integerValue];
NSString *str33 = [numInte stringValue]; //NSNumber转NSString
CGFloat resultFloat = [numFlo floatValue];
BOOL resultBool = [numBool boolValue];
NSLog(@"resultNum = %ld, str33 = %@, resultFloat = %f, resultBool = %d",resultNum,str33,resultFloat,resultBool);
运行结果如下:
总结:
- 将数值转化为NSNumber的语法:
NSNumber *NSNumber对象名 = [NSNumber numberWith数字类型:数值];
- 将NSNumber转化为数值类型:
基本数字类型 类型对象 = [NSNumber对象 基本数字类型Value];
二、NSValue
之所以把NSNumber和NSValue放到同一篇,是因为NSNumber是NSValue的子类,NSValue除了能够包装NSNumber能够包装的基础数字类型外,还能够包装系统框架提供的CGRect/CGPoint/CGSize等数据结构,也可以是自己定义的struct。最终也能放入数组。
- 封装方法:
+ (NSValue )valueWithBytes:(const void )value objCType:(const char *)type;
- 解封方法:
- (void)getValue:(void *)value;
同样,我们来看看它的应用:
//声明一个NSRange结构体
NSRange range = {9,1};
//把NSRange结构体快速的转换成为OC的对象
NSValue *value = [NSValue valueWithRange:range];
NSLog(@"NSValue = %@",value);
//把Value对象转换回NSRange结构体
NSRange result0Range = [value rangeValue];
// NSRange result0Range = value.rangeValue;
NSLog(@"location = %ld length = %ld",result0Range.location,result0Range.length);
//自定义一个结构体
struct cat {
NSInteger weight;
};
//实例化一个struct cat
struct cat myCat = {900};
//把自定义的结构体转换成为NSValue
//参数1: 所转化结构体的地址
//参数2: 转化类型所对应的C字符串(@encode(待转化类型))
NSValue *catValue = [NSValue value:&myCat withObjCType:@encode(struct cat)];
NSLog(@"catValue = %@",catValue);
//NSValue转换回自定义结构体
//实例化一个接收的实体
struct cat myCat1;
//需要接收实体的地址
[catValue getValue:&myCat1];
NSLog(@"myCat1.weight = %ld",myCat1.weight);
//使用结构体指针
struct cat *pCat = malloc(sizeof(struct cat));
pCat -> weight =10;
//转换为NSValue
NSValue *value1 = [NSValue value:pCat withObjCType:@encode(struct cat)];
//转换回自定义结构体
struct cat *pCat1 = malloc(sizeof(struct cat));
[value1 getValue:pCat1];
运行结果: