在 Objective-C 開發中,Foundation 框架提供了幾個核心結構體,它們是處理幾何圖形、範圍選取等基礎操作的基石。本文將系統整理 NSRange、NSPoint、NSSize、NSRect 的定義、創建方式及常用轉換方法,幫助開發者快速掌握這些基礎數據類型。
NSRange 用於描述一段連續區間的位置與長度,常見於字符串截取、數組切片等場景。
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
// 創建範圍:從第 8 個位置開始,長度為 10
NSRange range = NSMakeRange(8, 10);
// 讀取屬性
NSLog(@"location: %zi", range.location); // 輸出:8
NSLog(@"length: %zi", range.length); // 輸出:10
// 轉為字符串表示,便於調試
NSString *str = NSStringFromRange(range);
NSLog(@"%@", str); // 輸出:{8, 10}
提示:NSRange 並非物件,不可直接加入 NSArray 或 NSDictionary,需用 NSValue 封裝([NSValue valueWithRange:range])。
NSPoint 其實是 CGPoint 的別名,用於表示二維平面上的點(x, y)。
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef CGPoint NSPoint;
NSPoint p;
// 直接賦值
p.x = 10;
p.y = 10;
// 推薦:使用構造函數
p = NSMakePoint(11, 11); // Foundation 風格
p = CGPointMake(12, 12); // Core Graphics 風格
// 轉字符串
NSString *str = NSStringFromPoint(p);
NSLog(@"%@", str); // 輸出:{12, 12}
NSSize 對應 CGSize,包含寬度與高度。
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
typedef CGSize NSSize;
NSSize s;
// 直接賦值
s.width = 100.1;
s.height = 100.3;
// 構造函數
s = NSMakeSize(12.3, 16.9);
s = CGSizeMake(15.3, 19.2);
// 轉字符串
NSString *str = NSStringFromSize(s);
NSLog(@"%@", str); // 輸出:{15.3, 19.2}
NSRect 由原點(NSPoint)與尺寸(NSSize)組成,對應 CGRect。
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
typedef CGRect NSRect;
NSRect r; // 方式 1:分別設定 origin 與 size r.origin = NSMakePoint(50, 50); r.size = NSMakeSize(60, 60); // 方式 2:一步到位(最常用) r = NSMakeRect(20, 20, 30, 30); // x, y, width, height // 同樣可用 NSStringFromRect 轉字符串輸出
| 結構體 | 對應 CG 類型 | 構成欄位 | 構造函數 | 轉字符串 |
|---|---|---|---|---|
| NSRange | — | location, length | NSMakeRange | NSStringFromRange |
| NSPoint | CGPoint | x, y | NSMakePoint / CGPointMake | NSStringFromPoint |
| NSSize | CGSize | width, height | NSMakeSize / CGSizeMake | NSStringFromSize |
| NSRect | CGRect | origin, size | NSMakeRect / CGRectMake | NSStringFromRect |
這四個結構體均為純 C 結構,非 Objective-C 物件,效能極高,且可直接在 Swift 中以 NSRange、CGPoint、CGSize、CGRect 形式跨語言互通。熟練掌握它們的創建、拆解與轉換,是進行 iOS/macOS 界面佈局、動畫計算、文字排版的基本功。