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

黑马程序员——Foundation框架入门:NSNumber,NSValue和NSDate

2015-09-01 18:46 429 查看
———-android培训、Java培训、iOS培训,期待与您交流———-

一、NSNumber

用途:把基本数据类型的数据保存到NSArray或NSDictionary中。

赋值

int a = 10;
NSNumber *a1 = [NSNumbernumberWithInt:a];//这样就可以向NSArray中添加数值变量了:
NSMutableArray *arr = [NSMutableArray arrayWithObject:a1];


除了上面的基本方法外还有两个快速赋值的方法:

1.NSNumber *a3 = @(a);//将变量a赋值给a3

2.NSNumber *a4 = @10;//将变量a赋值给a4

取值

接上例:

NSNumber *a2 = arr[0];
[a2 intValue]; //如果是float类型的变量,则使用floatValue:
[a2 floatValue];//其他数据类型相似。


二、NSValue

NSValue包装对象指针,CGRect结构体等。一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象是不可枚举的。 简单来说,NSValue就是用来将不是对象的数据转换为对象,从而使得这些数据可以被存储在NSArray、NSDictionary等数据结合中。

赋值

OC提供了多种不同数据复制到NSValue型变量的方法。例如:

NSValue *v1 = [NSValue valueWithPoint:c1];//c1是已经定义的CGPointer结构体变量


类似的还有:

+(NSValue *)valueWithPoint:(NSPoint)point;
+(NSValue *)valueWithSize:(NSSize)size;
+(NSValue *)valueWithRect:(NSRect)rect;


等。

取值

NSPoint p1 = [v1 pointValue];


同样还有sizeValue、rectValue方法。

将自定义结构体转换为NSValue类型

typedef struct d{
int year;
int month;
int day;
} MyDate;
MyDate d1 = {2015,8,31};
NSValue *val = [NSValue valueWithBytes:&d1 objCType:@encode(MyDate)];//@encode(aType)返回一个该类型的C字符串


取出存入NSValue中的自定义结构体的值

接上例

MyDate md;//由于接收从NSValue转回MyDate的数据
[val getValue:&md];
NSLog(@"%d %d%d",md.year,md.month,md.day);


三、NSDate

显示时间:

NSDate *d = [NSDate date];
NSLog(@"%@",d);//使用这种方法显示的是格林威治时间,而不是本地时间


如果要显示本地时间,需要使用如下方法:

NSDate *d = [NSDate date];
NSTimeZone *zone = [NSTimeZone systemTimeZone]; //设置时区为当前系统时区
NSInteger interval =[zone secondsFromGMTForDate: d]; //获取当前时区和0时区的时间间隔
NSDate *localeDate = [d dateByAddingTimeInterval:interval]; //重新生成时间
NSLog(@"%@",localeDate);


格式化时间

想让系统输出的时间按照需要的格式呈现就需要格式化时间,方法如下:

NSDateFormatter *fmt = [NSDateFormatter new];//定义一个格式化对象,用于保存格式
fmt.dateFormat = @"yyyy年MM月dd日HH:mm:ss";//具体格式
NSString *dateStr = [fmt stringFromDate:d];//将当前时间以已经定义好的格式转换为NSString对象
NSLog(@"%@",dateStr);


在编写时间格式时不必包括时间的每一个部分,可以只有年月没有日等。

格式化的字母含义:

yyyy-四位年份

MM-两位月份

dd-两位日期

HH-两位小时数(24小时制)

hh-两位小时数(12小时制)

mm-两位分钟数

ss-两位秒数



计算时间

获取明天这个时候的时间,接上例:

NSTimeInterval inter = 60*60*24;//一天的秒数
NSDate *tmr = [NSDate dateWithTimeIntervalSinceNow:inter];
dateStr = [fmt stringFromDate:tmr];
NSLog(@"%@",dateStr);


获取昨天这个时候的时间,接上例:

tmr = [NSDate dateWithTimeIntervalSinceNow:-inter];


这是取巧的方法,取时间差的负值即可。

日期时间对象NSCalendar

单独获取某个时间

使用NSCalendar可以快速获取部分日期时间,例如年或秒。

NSDate *d = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *com = [cal components:NSCalendarUnitYear|NSCalendarUnitMinute fromDate:d];//可以通过添加竖线|添加更多的时间单元
NSLog(@"%ld%ld",com.year,com.minute);


计算两个时间点的时间差

NSString *time1 = @"2015-08-21
4000
20:21:22";
NSString *time2 = @"2015-09-02 13:21:02";//设定两个时间点

NSDateFormatter *fmt = [NSDateFormatter new];
fmt.dateFormat = @"yyyy-MM-ddHH:mm:ss";//格式化时间

NSDate *d1 = [fmt dateFromString:time1];
NSDate *d2 = [fmt dateFromString:time2];//将设定的两个时间点的NSString对象转换为NSDate对象

NSCalendar *cal = [NSCalendar currentCalendar];
int unit = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;//通过整形变量保存当前时间的具体每个部分

NSDateComponents *com = [cal components:unit fromDate:d1toDate:d2 options:0];

NSLog(@"相差%ld年%ld月%ld天%ld小时%ld分钟%ld秒钟",com.year,com.month,com.day,com.hour,com.minute,com.second);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c