在iOS开发中,读取NSValue的值需要根据NSValue所包装的数据类型来选择合适的方法。以下是一些常见数据类型的读取方法,参考了我搜索到的资料:
- 处理基本数据类型:
-
对于CGPoint类型,可以使用CGPointValue方法。
NSValue *pointValue = [NSValue valueWithCGPoint:CGPointMake(25.0, 15.0)];
CGPoint point = [pointValue CGPointValue];
NSLog(@"point is %@.", NSStringFromCGPoint(point));
这段代码展示了如何将CGPoint包装成NSValue对象,并从中提取CGPoint值。
- 处理NSRange类型:
-
使用rangeValue方法。
NSRange rangeA = NSMakeRange(0, 10);
NSValue *rangeValue = [NSValue valueWithRange:rangeA];
NSRange rangeB = [rangeValue rangeValue];
NSLog(@"%d,%d", rangeB.location, rangeB.length);
这段代码展示了如何将NSRange包装成NSValue对象,并从中提取NSRange值。
- 处理自定义结构体:
-
使用getValue:方法。
struct cat {
NSInteger weight;
};
struct cat myCat = {900};
NSValue *catValue = [NSValue value:&myCat withObjCType:@encode(struct cat)];
struct cat myCat1;
[catValue getValue:&myCat1];
NSLog(@"myCat1.weight = %ld", myCat1.weight);
这段代码展示了如何将自定义结构体包装成NSValue对象,并从中提取自定义结构体值。
- 处理其他系统框架提供的数据结构:
-
例如CGSize、UIEdgeInsets等,可以使用对应的方法如CGSizeValue、UIEdgeInsetsValue等。
CGSize size = CGSizeMake(50, 50);
NSValue *sizeValue = [NSValue valueWithCGSize:size];
CGSize extractedSize = [sizeValue CGSizeValue];
NSLog(@"size is %@.", NSStringFromCGSize(extractedSize));
这段代码展示了如何将CGSize包装成NSValue对象,并从中提取CGSize值
。
- 处理任意数据结构:
-
使用valueWithBytes:objCType:和getValue:方法。
CGRect rect = CGRectMake(0, 0, 320, 480);
NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(CGRect)];
CGRect extractedRect;
[value getValue:&extractedRect];
NSLog(@"rect is %@.", NSStringFromCGRect(extractedRect));
这段代码展示了如何将任意数据结构包装成NSValue对象,并从中提取任意数据结构值。
通过这些方法,可以根据NSValue所包装的数据类型选择合适的方法来读取其值。