NSNumber我们应该经常用,也很了解了。
那NSValue呢,是否有应用过呢?
下面开始吧。
NSValue
一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是不可枚举的。NSValue主要针对结构体进行包装。
基本使用:
CGPoint point = CGPointMake(20, 20); NSValue *pointValue = [NSValue valueWithCGPoint:point]; NSArray *array = @[pointValue]; NSValue *firstValue = array[0]; CGPoint point2; [firstValue getValue:&point2]; //CGPoint point2 = [firstValue CGPointValue]; NSLog(@“%@",NSStringFromCGPoint(point2));
封装自定义结构体:
首先自定义结构体一个:
typedef struct mystruct { int count; float height; }mystruct;
然后将结构体转为NSValue,并存入数组
mystruct mst; mst.count = 10; mst.height = 1000; NSValue *value = [NSValue value:&mst withObjCType:@encode(mystruct)]; NSArray *array = @[value]; //最后从数组中取出,并还原结构体,并输出日志 NSValue *firstValue = array[0]; mystruct mst2; [firstValue getValue:&mst2]; NSLog(@"count = %d,height = %f",mst2.count,mst2.height);
系统预定义方法,用于包装CGPoint、CGSize等结构体:
+ (NSValue *)valueWithCGPoint:(CGPoint)point; + (NSValue *)valueWithCGVector:(CGVector)vector; + (NSValue *)valueWithCGSize:(CGSize)size; + (NSValue *)valueWithCGRect:(CGRect)rect; + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform; + (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets; + (NSValue *)valueWithUIOffset:(UIOffset)insets NS_AVAILABLE_IOS(5_0); - (CGPoint)CGPointValue; - (CGVector)CGVectorValue; - (CGSize)CGSizeValue; - (CGRect)CGRectValue; - (CGAffineTransform)CGAffineTransformValue; - (UIEdgeInsets)UIEdgeInsetsValue; - (UIOffset)UIOffsetValue NS_AVAILABLE_IOS(5_0);
NSNumber
NSNumber主要针对于基本数据类型的包装,NSNumber继承于NSValue。
// 1.将int基本类型包装成NSNuber对象类型 NSNumber *ageNum = [NSNumber numberWithInt:10]; // 2.将包装后的对象存放到字典集合中 NSDictionary *dic = @{@"name":@"Jack",@"age":ageNum}; // 3.取出NSNumber对象 NSNumber *ageNum2 = dic[@"age"]; // 4.再将age对象转换称为基本数据类型int int age = [ageNum2 intValue]; NSLog(@"%d",age); // 输出 10 // NSNumber提供了很多将基本数据类型转换称为NSNumber对象类型的方法 // 简单举例 NSNumber *intNum = [NSNumber numberWithInt:20]; NSNumber *doubleNum = [NSNumber numberWithDouble:20.5]; NSNumber *floatNum = [NSNumber numberWithFloat:98.98787]; NSNumber *boolNum = [NSNumber numberWithBool:YES]; // 对应的转换称为基本数据类型的方法 int a = [intNum intValue]; double b = [doubleNum doubleValue]; float c = [floatNum floatValue]; BOOL d = [boolNum boolValue]; // NSString对象也可以转换称为int NSString *str = @"20"; int e = [str intValue]; // 输出 20
延伸:NSDecimalNumber
NSDecimalNumber继承于NSNumber,NSDecimalNumber提供了科学计数法的表示方法。
如果需要在应用程序中进行货币计算,可以使用NSDecimalNumber子类以保证最大的精度。由于该子类可以使用具有38位有效数字且指数范围在-128~127的数字,所以不需要担心舍入误差和其他浮点数据运算的数据损失问题。