天天看點

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

繼續閱讀