一:常用結構體
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方法
}