一:常用结构体
OC中常用的结构体有:NSRange,NSSize,NSPoint,NSRect,下面来看一下他们的常用方式
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:创建一个NSRange结构体表示范围
//结构体不需要加*
NSRange range = {3,4};
NSRange range1 = NSMakeRange(3, 4);
NSString *str = NSStringFromRange(range1);
NSLog(@"str = %@",str);
//2:先commond+NSSize 进去看看,它等同于CGSize 有两个值组成 weight height(我们可以理解为长方形的长和宽)
NSSize size = {12,23};
NSSize size2 = NSMakeSize(12, 23);
NSSize size3 = CGSizeMake(12, 15);//这种方式会经常用
NSString *str2 = NSStringFromSize(size2);
NSLog(@"str2 = %@",str2);
//2:NSPoint 相当于坐标系中的点的位置,等同于CGPoint
Point point = {33,44};
NSPoint point2 = NSMakePoint(33, 44);
NSString *str4 = NSStringFromPoint(point2);
NSLog(@"str4 = %@",str4);
//4:NSRect 矩形
NSRect rect = {{3,5},{5,9}};
NSRect rect2 = NSMakeRect(3, 5, 7, 9);
NSString *str5 = NSStringFromRect(rect2);
NSLog(@"str5 = %@",str5);
}
return 0;
}
二:基本数据类型包装类
回顾集合类:
OC集合类有NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSSet,NSMutableSet都是以面向对象的方式来操作数组的,而且OC数组不像C语言中的数组只能存放一种数据类型,它可以存放任意类型的对象(注意是对象,本质是地址)但是不能存放nil和非OC对象类型(基本数据类型int ,struct,enum等)如果有时候又非得存,就必须先将基本数据类型包装成对象类型然后再用集合类进行存储,OC中提供的包装类是:NSNumber,NSValue。其中NSNumber继承于NSValue(NSNumber主要针对于基本数据类型的包装,NSValue主要针对结构体进行包装),将包装成NSNSNumber或NSValue对象类型后存放到数组中,然后从结合类中取出NSNumber,NSValue对象再转换成为基本数据类型。
①:NSNumber
//<一>:NSNumber
//1:使用NSNumber 包装 int 数据类型
int a = 13;
NSNumber *num = [NSNumber numberWithInt:a];
NSLog(@"num = %@",num);
/*
包装的有何用?
①:可以直接转换成字符串
②:(后面会学到)OC中的集合类,不能存储基本数据类型,如果你想把基本数据类型存到数组,集合中,就必须把它转换成基本数据类型的包装类,以数组为例:
OC数组不像C语言中的数组只能存放一种数据类型,它可以存放任意类型的对象(注意是对象,本质是地址)
但是不能存放nil和非OC对象类型(基本数据类型int ,struct,enum等)如果有时候又非得存,就必须先将基本数据类型包装成对象
类型然后再用集合类进行存储,OC中提供的包装类是:NSNumber,NSValue。其中NSNumber继承于NSValue(NSNumber主要针对于基本数
据类型的包装,NSValue主要针对结构体进行包装)
*/
//2:NSnumber直接转换成字符串
NSString *strint = [num stringValue];
NSLog(@"strint = %@",strint);
//3:float 包装成NSNumber
NSNumber *num2 = [NSNumber numberWithFloat:23.43];
NSLog(@"num2 = %@",[num2 stringValue]);
//4:包装类转变成基本数据类型
float f = [num2 floatValue];
NSLog(@"f = %.2f",f );
②:NSValue
//<二>NSValue
//NSValue多用来包装结构体,结构体不是OC对象,所以不能够添加到数组里面,所以也需要包装
//NSNumber是NSValue的子类,但NSNumber只能包装数字类型,NSValue可以包装任意值(基本数据类型,结构体,指针都可以包装),也就可以用NSValue包装结构体后加入NSArray,NSDictionary等集合中。
//1:由于CGPonit ,CGRect,CGSize,等都是结构体所以我们以他们为例:
CGPoint point = CGPointMake(10, 10);
//将结构体变量包装成一个变量
NSValue *value1 = [NSValue valueWithPoint:point];
//NSLog(@"value1 = %@",value1);
//放进可变数组
NSMutableArray *array = [NSMutableArray array];
[array addObject:value1];
//从数组中取出来
NSValue *value2 = [array lastObject];
CGPoint po = [value2 pointValue];
NSLog(@"po = %@",NSStringFromPoint(po));
//或者用比较是否相等来判断
BOOL result = CGPointEqualToPoint(po, point);
//1 代表YES ; 0 代表NO
NSLog(@"result = %i",result);
//2:不用系统自带的,我们自己写一个结构体
test();
typedef struct
{
int year;
int month;
int day;
}Date;
void test()
{
Date date = {2014,17,7};
//把结构体Date 包装成Value
//void * 代表任何指针
//这里要传结构体的地址&date
char *type = @encode(Date);
NSValue *value3 = [NSValue value:&date withObjCType:type];
//从NSValue中取出
Date date2;
[value3 getValue:&date2];//跟打印出&error的原理是一样的,由于没有返回值,又想返回出date2,只能把地址传出来,用Date 接受
NSLog(@"年 = %i,月 = %i,日 = %i",date2.year,date2.month,date2.day );
//结构体的点代表返回内部的成员变量,OC对象的.代表set和get方法
}