1. 程式人生 > >黑馬程式設計師——Foundation框架——常用結構體(NSRange、NSPoint等)

黑馬程式設計師——Foundation框架——常用結構體(NSRange、NSPoint等)

一,Foundation框架簡介:

OC的Foundation框架包含了常用的類(所有類均是繼承自NSObject )和資料型別(結構體、列舉、等)。

路徑:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System

/Library/Frameworks/

在iOS開發中所有框架中Foundation框架是最基礎的框架,Foundation框架包含了常用的類和資料型別。

使用Foundation框架只要包含它的主標頭檔案即可<Foundation/Foundation.h>即可,主標頭檔案裡面包含了框架中所有的內容的標頭檔案

二,Foundation框架常用的結構體

常用的結構體有:NSRange,NSPoint/CGPoint,NSSize/CGSize,NSRect/CGRect

一般結構體用法如下:

// 定義結構體
struct Date {
    int year;
    int month;
    int day;
};

// 依次按照結構體順序為結構體賦值
struct Date date = {2014,3,20};

// 不按結構體順序為結構體賦值
struct Date date2 = {.year=2014, .day=20, .month=3};
NSRange結構體:用來描述範圍

官方文件的定義:

// 用於檢視範圍
typedef struct _NSRange {
    NSUInteger location;    // 起始位置
    NSUInteger length;      // 長度
} NSRange; // NSUInteger 型別為無符號型別,可以簡單理解為表示正整數的型別,在NSLog輸出時用ld

NSUInteger其實就是unsigned long無符號型別,定義如下

typedef unsigned long NSUInteger;
簡單說明:如果有字串“I like oc”,檢視like在整個字串中的範圍,有三種實現方式

分析:字串的起始位置為0空格也要計算,那麼like的起始位置為2,like的長度為4

下面兩種都是為NSRange結構體賦值的方式來實現

NSRange r1 = {2,4}; // 不推薦使用
NSRange r2 = {.location = 2, .length = 4}; // 不推薦使用
第三種方式是呼叫NSMakeRange()函式來實現
NSRange r3 = NSMakeRange(2, 4); // 推薦使用
查詢NSString類物件中某些字元在整個類物件中的NSRange
// 比如想檢視字串"I like oc"中的like在整個字串中的範圍
    NSString *str = @"I like oc";// NSString類的分類已經對這種需求做了實現 因此可以直接呼叫類方法來實現
    NSRange range  = [str rangeOfString:@"like"];// 列印的NSRange結構體中的變數由於都是NSUInteger型別 因此在輸出時用ld
    NSLog(@"location = %ld, length = %ld",range.location,rang.length);
注意:如果沒有找到要查詢的值,NSRange中的length = 0,location = NSNotFound,其中NSNotFound如果以NSLog(@"%d",NSNotFound);輸出一長串數字。

NSPoint結構體:通過一個座標點來標識元素位置

官方定義:

// 設定 double 型別的別名為 CGFLOAT_TYPE
# define CGFLOAT_TYPE double
// 定義CGFloat型別為double型別
typedef CGFLOAT_TYPE CGFloat;
// 定義CGPoint結構體
struct CGPoint {
    CGFloat x;
    CGFloat y;
};
// 定義CGPoint結構體為CGPoint型別
typedef struct CGPoint CGPoint;
// 設定結構體CGPoint = NSPoint
typedef CGPoint NSPoint;

總結:可以看出:CGPoint = NSPoint ,他們本質都是結構體,裡面都包含了兩個double型別來描述一個點

NSPoint的用法

// 同一個點的兩種表現方式
CGPoint point = NSMakePoint(20, 20);  // 不常用
NSPoint point2 = CGPointMake(20, 20); // 常用   // CGPointZero == CGPointMake(0,0);
NSSize結構體:描述元素的尺寸(寬和高),定義和NSPoint類似,一般用法為:
CGSize size = NSMakeSize(20, 40);
NSSize size2 = CGSizeMake(40, 20); // 常用
CGRect結構體:用於描述元素的位置(CGPoint)和尺寸(CGSize),一次可以說CGRect是描述了一個在手機螢幕上的矩形

官方定義:

struct CGRect {
CGPoint origin;   // 描述元素位置座標
CGSize size;    //  描述元素尺寸
};
typedef struct CGRect CGRect;
一般用法:
// 描述一個座標位置為(20,20)寬高分別為50和100的元素
CGRect rect = CGRectMake(20, 20, 50, 100); // 常用
NSRect rect2 = NSMakeRect(20, 20, 50, 100);
其他用法:
CGRectZero == CGRectMake(0,0,0,0); CGSizeZero == CGSizeMake(0,0); CGPointZero == CGPointMake(0,0);   // 第一種寫法:座標為(20,20)寬高分別為50和100
  CGRect rect = {{20,50},{50,100}};
  
  // 第二種寫法:座標為(20,20)寬高分別為50和100
  NSPoint point = CGPointMake(20, 20);
  NSSize size = CGSizeMake(50, 100);
  CGRect rect2  = {point,size};
  
  // 第三種寫法:座標為(0,0)寬高分別為50和100
  CGRect rect3 = {CGPointZero,CGSizeMake(50, 100)};
快速檢視結構體中的值:

第一種方式:

NSRect rect = CGRectMake(20, 20, 50, 100);<br>  
NSLog(@"x = %f, y = %f, width = %f, height = %f",rect.origin.x, rect.origin.y
, rect.size.width, rect.size.height);   // 這裡的. 不是get方法只是單純的從結構體中獲取值而已
第二種方式:將結構體直接轉換為字串後列印
NSRect rect = CGRectMake(20, 20, 50, 100);

// 先將結構體轉換稱為字串
NSString *strRect = NSStringFromRect(rect);

// 直接列印轉換後的字串
NSLog(@"%@",strRect); // NSSize/NSPoint這兩種結構體NSStirng也提供了類似的方法
結構體常用方法:
// 1.判斷兩個點的位置是否相等
BOOL pointIsEqual = CGPointEqualToPoint(CGPointMake(50, 100), CGPointMake(100, 50));
NSLog(@"%d",pointIsEqual);
// 2.判斷尺寸大小是否相等
BOOL sizeIsEqual = CGSizeEqualToSize(CGSizeMake(50, 100), CGSizeMake(50, 100));
NSLog(@"%d",sizeIsEqual);

// 第一種寫法:座標為(20,20)寬高分別為50和100
CGRect rect1 = {{20,50},{50,100}};
// 第二種寫法:座標為(20,20)寬高分別為50和100
NSPoint point = CGPointMake(20, 20);
NSSize size = CGSizeMake(50, 100);
CGRect rect2  = {point,size};
// 3.判斷兩個矩形是否相等
BOOL rectIsEqual = CGRectEqualToRect(rect1, rect2);
NSLog(@"%d",rectIsEqual);
// 4.判斷一個點是否在矩形上面
BOOL isContent = CGRectContainsPoint(rect1, CGPointMake(20, 50));
NSLog(@"%d",isContent);