我们知道NSArray和NSDictionary只能存储OC对象,不能存储基本数据、struct。但有时我们需要存储呢,那怎么办呢,可以将其封装成对象。那就要用到NSValue了。
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}
NSNull
集合中不能存放nil值,因为nil在NSArray和NSDictionary中有特殊含义,但有时我们确实需要存储一个表示“空”的值,那么我们就可以使用NSNull,它是NSObject的子类。只有一个方法。
+ (NSNull *)null
NSNull *nl = [NSNull null];
这样就可以将nl存入数组和字典中了。
[NSNull null]总是返回一样的数值所以可以使用==将该值与其他值进行比较。