天天看点

OC语法<4.8> Foundation框架中的-常用结构体和基本数据类型包装类

一:常用结构体                                                                                                                                                             

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方法
    
}
           

继续阅读