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);
CGRect, CGPoint, CGSize, MKCoordinateRegion, CMTime 等。[NSValue valueWithCGRect:] 等,優先使用。NSValue 橋接 C 結構體與 Objective-C 對象世界,字典存儲無障礙。