因为NSArray等一系列集合是不允许基本数据类型、结构体和空值加入的,当我们要把一个基本数据类型和结构体加入集合时,我们必须把它进行包装,包装成一个类再加入。
其中NSNumber是对基本数据类型的包装,而NSValue是对结构体的包装。
另外NSNumber是NSValue的子类。
在Java中有自动装箱和拆箱的概念,和这个是类似的,只不过OC中我们只能手动装拆。
NSNumber:
//
// main.m
// NSNumber
//
// Created by zzqiltw on 14-5-29.
// Copyright (c) 2014年 zzqiltw. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
// Java是自动装箱拆箱,OC要手动来装拆。
@autoreleasepool {
// 创建一个可变数组
NSMutableArray *array = [NSMutableArray array];
// 由于数组里不能加入基本数据类型以及nil,所以得先把int类型包装成NSNumber,再加入
NSNumber *number = [NSNumber numberWithInt:10];
[array addObject: number];
NSLog(@"%@", array);
// 同样取出来的时候还是NSNumber对象, 还是要把它拆包成int类型。
NSNumber *number2 = [array objectAtIndex:0];
int result = [number2 intValue];
NSLog(@"%i", result);
}
return 0;
}
NSValue:
//
// main.m
// NSValue
//
// Created by zzqiltw on 14-5-29.
// Copyright (c) 2014年 zzqiltw. All rights reserved.
//
#import <Foundation/Foundation.h>
void value1() {
CGPoint point = CGPointMake(12, 13);
// 先将结构体包装成对象NSValue
NSValue *value = [NSValue valueWithPoint:point];
// 再把结构体加入数组
NSArray *array = [NSArray arrayWithObject:value];
NSLog(@"%@", array);
// 最后把NSValue拆成结构体
CGPoint point2 = [[array lastObject] pointValue];
NSLog(@"%i", CGPointEqualToPoint(point, point2));
}
void value2() {
typedef struct {
int year;
int month;
int day;
} Date;
Date date = {2014, 5, 29};
const char *type = @encode(Date);
// 第一个参数void * 代表任何指针
// 这里要传结构体的地址&date;
// 第二个参数要根据结构体类型生成对应的类型描述字符串(const char *, 如上式求得)
NSValue *value = [NSValue value: &date withObjCType:type];
NSArray *array = [NSArray arrayWithObject:value];
NSLog(@"%@", array);
Date date1;
[value getValue:&date1];
NSLog(@"%i-%i-%i", date1.year, date1.month, date1.day);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// value1();
value2();
}
return 0;
}