您的位置:首页 > 产品设计 > UI/UE

数值类对象:NSNumber,NSValue,NSNull

2014-11-12 17:30 246 查看
基本,集合,复杂,对象

可用对象封装基本数值,然后将对象放入NSArray或NSDictionary 中。

用对象封装基本数值后,即可给其发送消息。

数值类型包括:NSNumber,NSValue,NSNull类。

oc不支持自动装箱

NSNumber类

创建方法

+ (NSNumber *)numberWithChar:(char)value;

+ (NSNumber *)numberWithInt:(int)value;

+ (NSNumber *)numberWithFloat:(float)value;

+ (NSNumber *)numberWithDouble:(double)value;

+ (NSNumber *)numberWithBool:(BOOL)value;

+ (NSNumber *)numberWithInteger:(NSInteger)valueNS_AVAILABLE(10_5, 2_0);

创建类型后,就可以放入字典或数组中。

解除装箱,获取数据:

- (char)charValue;

- (int)intValue;
- (float)floatValue;

- (double)doubleValue;

- (BOOL)boolValue;

可以任意类型的转换

发送消息:

NSNumber 继承自NSObject;

可使用compare、isEqual等消息。

NSNumber是NSValue的子类。

NSValue可包装任意类型值。

泛型指针

void * 针对简单,复杂数据类型

id     可指向任意oc对象的指针

NSArray和NSDictionary是不支持存储基本数据类型的,所以Cocoa提供了NSNumber类用来包装基本的数据类型,如:int、char、BOOL、float..等各种有符号和无符号的基本数据类型

NSNumber

1、

+ (NSNumber *)numberWithChar:(char)value;

+ (NSNumber *)numberWithInt:(int)value;

+ (NSNumber *)numberWithFloat:(float)value;

+ (NSNumber *)numberWithBOOL:(BOOL)value;

...

...

创建NSNumber对象

NSNumber *number;

number = [NSNumber numberWithInt:123];

 

 

2、

- (char)charValue;

- (int)intValue;

- (float)floatValue;

- (BOOL)boolValue;

...

...

提取数值

[number intValue];

 

创建了NSNumber之后,就可以把它存储到NSArray或者NSDictionary中了:

NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

[array addObject:number];//存储到数组中

可以用快速枚举遍历数组元素

for(NSNumber *num in array)

{

  NSLog(@"%c", [num intValue]);

}

 

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:10];

[dic setObject:number forKey:@"1"];//存储到字典中

可以用快速枚举遍历字典元素

for(id mdic in dic)

{

  NSLog(@"%c", [[dic objectForKey:mdic] intValue]);

}

通常,将一个基本类型的数据包装成对象叫做装箱(boxing),从对象中取出基本数据类型叫做取消装箱(unboxing)

 

 

 

NSValue

实际上NSMunber是NSValue的子类,NSValue可以包装任意一个对象,可以用NSValue将struct存到NSArray和NSDictionary中。

 

1、+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

创建一个NSValue

value:对象地址

objCType:通常是一个用来描述对象类型和大小的字符串,@encode可以接受一个数据类型的名称自动生成一个合适的描述字符串

 

2、- (void)getValue:(void *)value(出参);

从接受value的对象中

提取数值

提取的数值,存放在这个指针所指向的内存块里。

 

3、Cocoa提供了常用struct数据类型转换成NSValue的便捷方法:

+ (NSValue *)valueWithPoint:(NSPoint)point;

+ (NSValue *)valueWithSize:(NSSize)size;

+ (NSValue *)valueWithRect:(NSRect)rect;

- (NSPoint)pointValue;

- (NSSize)sizeValue;

- (NSRect)rectValue;

[cpp] view
plaincopy

//声明并初始化一个struct  

NSRect rtc = NSMakeRect(12, 32, 433, 343);  

//创建一个NSValue:  

//value:对象地址  

//objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串  

NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];  

//把value添加到数组中  

NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];  

[array addObject:value];  

  

NSRect rt;  

//从数组中取到NSValue,因为只添加了一个,所以小标是0  

NSValue *v = [array objectAtIndex:0];  

//从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的  

[v getValue:&rt];  

//输出结果  

NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);  

  

//用快速枚举遍历array并输出NSValue中struct属性的值  

for(NSValue *v in array)  

{  

    NSRect rt;  

    [v getValue:&rt];  

    NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);  

}  

  

  

/////////////////////便捷的struct转换成NAValue方式////////////////////////  

//声明并初始化一个struct  

NSRect rtc1 = NSMakeRect(100, 200, 300, 400);  

//创建一个NSValue  

NSValue *value1 = [NSValue valueWithRect:rtc1];  

//把value1添加到数组中  

NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];  

[array1 addObject:value1];  

NSRect rt1 = [value1 rectValue];  

//输出结果  

NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);  

自定义类型

[cpp] view
plaincopy

typedef struct  

{  

    int    id;  

    float  height;  

    unsigned char   flag;  

} MyTestStruct;  

  

MyTestStruct myTestSturct;  

myTestSturct.id = 1;  

myTestSturct.height = 23.0;  

myTestSturct.flag = 'A';  

//封装数据  

NSValue *value = [NSValue valueWithBytes:&myTestSturct objCType:@encode(MyTestStruct)];  

//取出value中的数据  

MyTestStruct  theTestStruct;  

  

[value getValue:&theTestStruct];//可对theTestStruct操作取得其中的数据  

NSNull

在集合中不能存放nil值,因为在NSArray和NSDictionary中nil有特殊的含义。但是在有些时候,确实需要用到这样的空值,比如在字典中,电话簿中"Jack"关键字下有电话号码、家庭住址、Email等等信息,但是现在只知道他的电话号码,这种不知道其他信息的情况下为了消除一些歧义,有必要将它们设置为空,所以Cocoa提供了NSNull

NSNull只有一个方法:null

[dictionary setObject:[NSNull null], forKey:"Email"];

if(EmailAdress == [NSNull null])

{

  //to do something...

}

[cpp] view
plaincopy

//声明并初始化一个struct    

    NSRect rtc = NSMakeRect(12, 32, 433, 343);    

    //创建一个NSValue:    

    //value:对象地址    

    //objCType:通常是一个用来描述对象类型和大小的字符串,@encode会自动生成一个合适的描述字符串    

    NSValue *value = [NSValue valueWithBytes:&rtc objCType:@encode(NSRect)];    

    //把value添加到数组中    

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];    

    [array addObject:value];    

      

    NSRect rt;    

    //从数组中取到NSValue,因为只添加了一个,所以小标是0    

    NSValue *v = [array objectAtIndex:0];    

    //从value中取得一个NSRect,虽然返回值是void,但其实是它是利用指针返回值的    

    [v getValue:&rt];    

    //输出结果    

    NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);    

      

    //用快速枚举遍历array并输出NSValue中struct属性的值    

    for(NSValue *v in array)    

    {    

        NSRect rt;    

        [v getValue:&rt];    

        NSLog(@"%f %f %f %f", rt.origin.x, rt.origin.y, rt.size.height, rt.size.width);    

    }    

      

      

    /////////////////////便捷的struct转换成NAValue方式////////////////////////    

    //声明并初始化一个struct    

    NSRect rtc1 = NSMakeRect(100, 200, 300, 400);    

    //创建一个NSValue    

    NSValue *value1 = [NSValue valueWithRect:rtc1];    

    //把value1添加到数组中    

    NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];    

    [array1 addObject:value1];    

    NSRect rt1 = [value1 rectValue];    

    //输出结果    

    NSLog(@"%f %f %f %f", rt1.origin.x, rt1.origin.y, rt1.size.height, rt1.size.width);  }  

[cpp] view
plaincopy

//函数声明,定义时,需要出现参数类型  

   //调用函数时,不出现数据类型      /1  

   //若出现数据类型,则为强制转换    /2  

   NSMutableArray *kbArr;  

   NSMutableDictionary *kbDic;  

     

   NSRect stRect = {1,20,200,200};  

   //NSValue *vlaue = [NSValue valueWithRect:stRect];  

     

   //1  

   NSValue *vlaue = [NSValue valueWithBytes:&stRect objCType:@encode(NSRect)];  

   //2  

   NSValue *vlaue1 = [NSValue valueWithBytes:(const void *)&stRect objCType:(const char *)@encode(NSRect)];  

     

   [kbArr addObject:vlaue];  

   [kbDic setObject:vlaue forKey:@"stRect"];  

本章总结:

掌握nsnumber类的作用,实用方法。

掌握nsvalue类的作用,实用方法。

掌握nsnull类的作用,实用方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息