NSNumber
OC中集合类中只能存储OC对象不能存储基本数据类型
如果要存储对基本数据类型进行包装
存储基本数据类型
1. 基本数据类型 -> 包装类型(NSNumber) -> 存入集合类
2. 从集合中取出包装类型 -> 包装类型(NSNumber) -> 基本数据类型
NSNumber的使用
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 基本数据类型转包装类型
NSNumber *number = [NSNumber numberWithInt:19];
number = [NSNumber numberWithFloat:10.1f];
number = [NSNumber numberWithDouble:10.10];
number = [NSNumber numberWithBool:YES];
// 包装类型转基本数据类型
int i = number.intValue;
number.floatValue;
number.doubleValue;
number.boolValue;
// 快速创建NSNumber对象
number = @1;
number = @1.1;
number = @1.2f;
}
return 0;
}
NSValue
NSNumber实际上是NSValue的子类,NSValue可以封装任意值。你可以将NSValue将结构体放入NSArray、NSDictionary
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 结构体转包装类型
NSRange range = {1,20};
NSValue *value = [NSValue valueWithRange:range];
NSPoint point = CGPointMake(1.2,10.2);
NSValue *value2 = [NSValue valueWithPoint:point];
NSSize size = CGSizeMake(10, 20);
NSValue *value3 = [NSValue valueWithSize:size];
NSRect rect = CGRectMake(10, 10, 20, 20);
NSValue *value4 = [NSValue valueWithRect:rect];
// 自定义的结构体转NSValue
typedef struct {
int year;
int month;
int day;
} ZZDate;
ZZDate date = {2014,12,5};
NSValue *value5 = [NSValue valueWithBytes:&date objCType:@encode(ZZDate)];
NSLog(@"%@",value5);
// 包装类型转结构体
ZZDate d1;
[value5 getValue:&d1];
NSLog(@"%d,%d,%d",d1.year,d1.month,d1.day);
NSRange r1;
[value getValue:&r1];
NSLog(@"%lu,%lu",(unsigned long)r1.length,(unsigned long)r1.location);
}
return 0;
}