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的数字,所以不需要担心舍入误差和其他浮点数据运算的数据损失问题。