首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 將 C 結構體存入 NSDictionary:用 NSValue 封裝非對象類型

     編輯:程式設計綜合問答

NSDictionary 只能存儲 Objective-C 對象(id 類型),C 結構體(如 MKCoordinateRegion)需用 NSValue 封裝後存入。

錯誤代碼

MKCoordinateRegion region = ...;
[dict setObject:region forKey:@"region"]; // ❌ 編譯錯誤:incompatible type 'id'

正確封裝方式

MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
// 關鍵:用 NSValue 封裝,需指定 @encode 類型編碼
NSValue *regionValue = [NSValue value:®ion withObjCType:@encode(MKCoordinateRegion)];
[dict setObject:regionValue forKey:@"region"];

// 取出時解封裝
MKCoordinateRegion outRegion;
[regionValue getValue:&outRegion];

通用封裝宏

#define BOX_STRUCT(value, type) [NSValue value:&(value) withObjCType:@encode(type)]
#define UNBOX_STRUCT(value, type) ({ type out; [value getValue:&out]; out; })

// 使用
[dict setObject:BOX_STRUCT(region, MKCoordinateRegion) forKey:@"region"];
MKCoordinateRegion r = UNBOX_STRUCT(dict[@"region"], MKCoordinateRegion);

支持的結構體類型

  • 所有純 C 結構體:CGRect, CGPoint, CGSize, MKCoordinateRegion, CMTime 等。
  • Foundation 已提供便利構造器:[NSValue valueWithCGRect:] 等,優先使用。

NSValue 橋接 C 結構體與 Objective-C 對象世界,字典存儲無障礙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved