通过前面对Foundation框架中NSArray、NSDictionary的学习,对于OC语言中的存储类型所存储的都是对象,C语言中的int等基本数据类型无法存到数组、字典中。有什么办法能解决这个问题呢?
其实Foundation框架中有专门解决这个问题的类-NSNumber类和NSValue类,可以借助两个类实现类型之间的转换。
NSNumber类
NSNumber类实现的功能是C语言中的基本数据类型和OC对象相互转换。
NSValue类实现的功能是C语言声明的结构体和OC对象相互转换。
下面先来学习一下NSNumber的具体使用:
#import <Foundation/Foundation.h>
int main() {
int number=5;
NSNumber * intNum=[[NSNumber alloc] initWithInt:number];
//将对象5存储到数组中。
NSArray * array=[NSArray arrayWithObjects:intNum, nil];
//输出array数组中的对象
NSLog(@"the array is :%@",array);
//从数组中得到对象5,由于数组中只有一个对象5,所以索引是0
NSNumber * getNum=[array objectAtIndex:0];
//重新得到int类型的值
int getNumber=[getNum intValue];
NSLog(@"the number is :%d",getNumber);
return 0;
}
输出结果是:
NSValue类的使用
对于NSValue来说,它的作用是可以将C语言中的结构体转换成对象,反之,将结构体对象转换成结构体也可以。
目前我们接触过的关于Foundation框架中的结构体只有NSRange,我们还会接触到NSPoint(记录某个点的坐标的结构体,包含X和Y两个浮点型的变量)、NSSize(包含width和height两个浮点型变量)、NSRect(包含NSPoint类型的变量origin和NSSize类型的变量size,一般定义四边形的时候用)。
以上四个结构体,我们目前只需掌握NSRange即可,其他三个以后碰到会讲。
例子:
#import <Foundation/Foundation.h>
int main() {
//定义一个NSRange类型的变量
NSRange range;
range.length=2;
range.location=1;
//将range转换成对象
NSValue * value=[NSValue valueWithRange:range];
//将NSRange对象转换成NSRange变量
NSRange theRange=[value rangeValue];
//输出这个结构体中的数据,(unsigned long)是强制类型转换,和C语言类似
NSLog(@"%lu,%lu",(unsigned long)theRange.length,(unsigned long)theRange.location);
return 0;
}
输出结果:2,1
在这两个包裹类中,还有一些方法(一般用这两个类进行类型转换时使用,很少单独用这两个类),如果感兴趣,可以参考文档。
通过本章的讲解,Foundation框架中的常用数据类型基本上就讲完了,还有两个比较常用的类型:日期类(NSDate)和二进制类(NSData)比较简单,会在讲解过程中给大家介绍。