(四) IOS学习之--NSNumber & NSVal
2018-07-09 本文已影响15人
CodingEleven
-NSNumber
现在有一个问题,如果想把基本数据(比如NSInteger ,float,char,bool...)放进NSArray\NSDictionary中,但是NSArray\NSDictionary只能存放OC对象
, 不能存放基本数据,因此需要把数据转成OC对象,NSNumber正好承担了这一封装任务.
NSInteger num = 100 ;
CGFloat f = 9.01 ;
BOOL flag = YES;
1. C基本类型转换成NSNumber
NSNumber *intNum = [NSNumber numberWithInteger:num];
NSNumber *floatNum = [NSNumber numberWithFloat:f];
NSNumber *boolNum = [NSNumber numberWithBool:flag];
NSLog(@"intNum=%@\rfloatNum=%@\rboolNum=%@",intNum,floatNum,boolNum);
//intNum=100 floatNum=9.01 boolNum=1
基本数据类型转成NSNumber后就可以存入NSArray\NSDictionary处理.
2. NSNumber 转C基本类型
NSInteger resInt = [intNum integerValue];
CGFloat resFloat = [floatNum floatValue];
BOOL resBool = [boolNum boolValue];
NSLog(@"resultNum = %ld, resultFloat = %f, resultBool = %d",resInt,resFloat,resBool);
//resultNum = 100, resultFloat = 9.010000, resultBool = 1
3. NSNumber 转字符串
NSString *str = [intNum stringValue];
NSLog(@"%@",str);// str = "100"
后续问题:弄懂NSInteger跟int区别,CGFloat跟float,double区别
-NSValue
NSNumber为基本类型提供了封装方法,那么NSValue主要用来封装数据结构
,可以是系统框架提供的CGRect/CGPoint/CGSize
等数据结构,也可以是自己定义的struct。
1.NSValue跟OC结构体互转
//声明一个NSRange结构体
NSRange range = {9,1};
//把NSRange结构体转换成OC对象
NSValue *rangeValue = [NSValue valueWithRange:range];
NSLog(@"%@",rangeValue); // NSRange: {9, 1}
//把value转成结构体
NSRange resRange = [rangeValue rangeValue];
NSLog(@"location = %ld , length = %ld", resRange.location,resRange.length);//location = 9 , length = 1
2.NSValue跟自定义结构体互转
//定义一个struct cat
struct cat{
NSInteger age;
CGFloat weight;
};
//实例化cat
struct cat myCat = {3,16.0};
//把自定义结构体转成NSValue
//参数1:所转化结构体的地址
//参数2:转化类型所对应的C字符串(@eccode(待转化类型))
NSValue *catValue= [NSValue value:&myCat withObjCType:@encode(struct cat)];
//把NSValue转成结构
struct cat myCat1;
[catValue getValue:&myCat1];
NSLog(@"age=%ld,weight=%lf",myCat1.age,myCat1.weight); //age=3,weight=16.000000
3.NSValue与结构体指针互转
//实例化结构体指针
struct cat *pCat = malloc(sizeof(struct cat));
pCat -> weight =18;
pCat -> age =4;
//转换为NSValue
NSValue *value1 = [NSValue value:pCat withObjCType:@encode(struct cat)];
//转换回自定义结构体
struct cat *pCat1 = malloc(sizeof(struct cat));
[value1 getValue:pCat1];
NSLog(@"age = %ld , weight = %lf",pCat->age,pCat->weight);//pCat -> weight =15;