前言
众所周知,Objective-C里的数组要求存储的值为对象,而结构体作为数组元素的时候就涉及到了自定义结构体包装成对象的问题。通常使用NSValue来包装一个结构体。
具体实现步骤如下:
- 第一种情况
-
系统封装好的结构体包装成NSValue类型
// 例1: // 创建一个NSRange对象 NSRange range = NSMakeRange(0,5); // 装包 NSValue *rangeValue = [NSValue valueWithRange:rang]; // 至此就完成了将一个系统提供的结构体封装成对象的过程 // 解包 NSRange range1; // 将rangeValue里保存的结构体取出来,赋值给range1. rang1 = [rangValue rangeValue]; // 例2: // 创建一个NSPoint对象 NSPoint point = {3,5}; // 装包 NSValue *pointValue = [NSValue valueWithPoint:point]; // 解包 NSPoint point1; point1 = [pointValue pointValue];
系统包装好的结构体,Xcode会有代码提示
-
- 第二种情况
-
自定义结构体包装成NSValue类型
// 首先自定义一个结构体 typedef struct { char name[20]; char gender[20]; int age; int score; int num; }Student; // 给结构体赋初值 Student stu1 = {"Phelan", "male", 99, 97, 7}; // 装包 NSValue *stu1Value = [NSValue valueWithBytes:&stu1 objCType:@encode(Student)];// 苹果官方更推荐使用这个方法 /* 实现效果一样 NSValue *stu1Value = [NSValue value:&stu1 withObjCType:@encode(Student); */ // 解包 // 将stu1装包后的值取出来赋值给stu2 Student stu2; [stu1Value getValue:&stu1]; NSLog(@"name = %s, gender = %s, age = %d, score = %d, num = %d", stu1.name, stu1.gender, stu1.age, stu1.score, stu1.num);
-
- 附录
-
Apple官方文档
-
总结
至此就完成了结构体到对象类型的封装,初学者要充分利用Apple提供的官方文档。在开发中一定能够事半功倍。