通过前面对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)比较简单,会在讲解过程中给大家介绍。