我们知道NSArray和NSDictionary只能存储OC对象,不能存储基本数据、struct。但有时我们需要存储呢,那怎么办呢,可以将其封装成对象。那就要用到NSValue了。
NSValue可以封装任意值,NSNumber实际上是NSValue的子类,可以使用NSValue将结构体封装放入NSArray或NSDictionary中。
快捷初始化方法。
+(NSValue *)valueWithPoint:(NSPoint)point; +(NSValue *)valueWithSize:(NSSize)size; +(NSValue *)valueWithRect:(NSRect)Rect; -(NSPoint)pointValue; -(NSSize)sizeValue; -(NSRect)RectValue;
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { CGSize size = CGSizeMake(50, 60); NSLog(@"size.width = %f,size.height = %f",size.width,size.height); //将结构体变量封装成对象。 NSValue *sz = [NSValue valueWithSize:size]; //对象可以在数组中。 NSArray *ary = [NSArray arrayWithObject:sz]; NSLog(@"ary =%@",ary); //从对象中取出结构体。 CGSize size1 = [sz sizeValue]; NSLog(@"size1.width = %f,size1.height = %f",size1.width,size1.height); BOOL result = CGSizeEqualToSize(size, size1); NSLog(@"result = %i",result); } return 0; }输出结果:
2016-01-14 18:48:31.635 命令行工程[10273:824511] size.width = 50.000000,size.height = 60.000000 2016-01-14 18:48:31.669 命令行工程[10273:824511] ary =( "NSSize: {50, 60}" ) 2016-01-14 18:48:31.669 命令行工程[10273:824511] size1.width = 50.000000,size1.height = 60.000000 2016-01-14 18:48:31.669 命令行工程[10273:824511] result = 1这几个只是针对NSRect、NSSize、NSPoint这几个,如果是自定义结构体就不行了。
那就需要使用
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
+ (NSValue *)value:(const void *)value withObjCType:(const char *)type;
#import <Foundation/Foundation.h> typedef struct{ int age; float height; }Stu; int main(int argc, const char * argv[]) { @autoreleasepool { Stu st ={20,175}; // void *代表任何指针 // 这里要传结构体的地址&date // 根据结构体类型生成 对应的 类型描述字符串 @encode(Stu) NSValue *value = [NSValue valueWithBytes:&st objCType:@encode(Stu)]; NSLog(@"@encode(Stu) = %s",@encode(Stu)); // 定义一个结构体变量 Stu st1; // 取出包装好的结构体 [value getValue:&st1]; // [value objCType]; 取出类型描述字符串 const char *type = [value objCType]; NSLog(@"age=%i, height=%f", st1.age,st1.height); NSLog(@"type = %s",type); } return 0; }
2016-01-14 18:48:31.670 命令行工程[10273:824511] @encode(Stu) = {?=if} 2016-01-14 18:48:31.670 命令行工程[10273:824511] age=20, height=175.000000 2016-01-14 18:48:31.670 命令行工程[10273:824511] type = {?=if}
集合中不能存放nil值,因为nil在NSArray和NSDictionary中有特殊含义,但有时我们确实需要存储一个表示“空”的值,那么我们就可以使用NSNull,它是NSObject的子类。只有一个方法。
+ (NSNull *)null
NSNull *nl = [NSNull null];
这样就可以将nl存入数组和字典中了。
[NSNull null]总是返回一样的数值所以可以使用==将该值与其他值进行比较。