在Foundation中定義了很多常用結構體類型來簡化我們的日常開發(fā)
NSRange(location length)用來表示范圍,分多種情況
NSPoint / CGPoint(開發(fā)中常用后者)
NSSize / CGSize
NSRect / CGRect (CGPint CGSize)
NSRange原型
typedef struct _NSRange { NSUInteger location; NSUInteger length;} NSRange;
這是 NSRange 結構體的內部結構的形式,兩個成員,一個長度,一個位置。不需要再和 c 一樣使用 struct 關鍵字,且成員的數據類型是 NSUInteger
typedef unsigned long NSUInteger;
屬于無符號長整型類型的替代寫法,就知道它就是一個整型的正數而已。
使用 NSRange 結構體表示范圍,比如:
//{1, 2, 3, 4, 5} //表示3,4,5的范圍,location=2,length=3
從0開始計數,第2個位置開始,長度為3。
字符串里 love 的范圍,從0開始計數第2個位置,長度為4
@"i love oc";
下面這兩種寫法不推薦(前者可讀性太差,后者太冗長)
//NSRange r1 = {2, 4}; // 不用//NSRange r2 = {.location = 2, .length = 4};// 不用
要掌握下面這個寫法,上面的兩個不使用
NSRange r3 = NSMakeRange(2, 4); // 掌握
在工程中,經常用到的一個查找字符串位置的方法
NSString *str = @"i love oc"; // 查找某個字符串在str中的范圍,很常用的一個方法,重要! // 如果找不到,length=0,location=NSNotFound==-1 NSRange range = [str rangeOfString:@"java"]; NSLog(@"loc = %ld, length=%ld", range.location, range.length);
因為,location 是無符號 long 類型,那么-1打印出來會是一個很大的正數。當然,如果最高位按照負數表示了,也就是NSNotFound按照(帶符號)整數打印,那么就是-1。
NSPoint / CGPoint
點結構體
struct CGPoint { CGFloat x; CGFloat y;};typedef struct CGPoint CGPoint;
還有:
typedef CGPoint NSPoint;typedef struct _NSPoint { CGFloat x; CGFloat y;} NSPoint;
繼續(xù)查看:
typedef CGFLOAT_TYPE CGFloat;
繼續(xù)查看:
#define CGFLOAT_TYPE double
本質就是 double 類型
類似 NSRange 結構體
CGPoint p1 = NSMakePoint(10, 10);NSPoint p2 = CGPointMake(20, 20);// 最常用
NSSize / CGSize
表示高度,寬度尺寸的結構體,聯(lián)想記憶。
NSSize s1 = CGSizeMake(100, 50); NSSize s2 = NSMakeSize(100, 50); CGSize s3 = NSMakeSize(200, 60);
CGRect 表示矩形尺寸
CGRect r1 = CGRectMake(0, 0, 100, 50); CGRect r2 = { {0, 0}, {100, 90}}; CGRect r3 = {p1, s2};
可以看到對于常用結構體在Foundation框架中都有一個對應的make方法進行創(chuàng)建,這也是我們日后比較常用的操作;
而且與之對應的還都有一個NSStringFromXX方法來進行字符串轉換,方便我們調試。上面也提到NSSize其實就是CGSize,NSRect其實就是CGRect。
注意:
UI是iOS的UI庫,用objective-c封裝的
NS是objc的基礎庫
CG,CF等是比較底層的C語言的庫
可以理解UIFont就是用objc封裝過的CGFont,用起來方便些
新聞熱點
疑難解答