今天普及下NSValue和NSNumber

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

 

尊重原创内容,转载请注明出处
本文链接地址: https://www.awnlab.com/archives/128

为您推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注