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

OC结构体、NSNumber、NSValue、NSDate

2015-11-10 12:18 483 查看
一、常见结构体

1、NSPoint和CGPoint的使用

CGPoint和NSPoint是同义的
typedef CGPoint NSPoint;
CGPoint的定义 struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat; //64位是double, 32位是float
CGPoint代表的是二维平面中的一个点 可以使用CGPointMake和NSMakePoint函数创建CGPoint


2、NSSize和CGSize的使用

CGSize和NSSize是同义的
typedef CGSize NSSize;
CGSize的定义 struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
CGSize代表的是二维平面中的某个物体的尺寸(宽度和高度) 可以使用CGSizeMake和NSMakeSize函数创建CGSize


3、NSRect和CGRect的使用

CGRect和NSRect是同义的
typedef CGRect NSRect;
CGRect的定义 struct {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
CGRect代表的是二维平面中的某个物体的位置和尺寸 可以使用CGRectMake和NSMakeRect函数创建CGRect


二、NSNumber的使用

1、NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray \NSDictionary中

2、NSNumber的创建

+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;


3、从NSNumber转化基本类型数据

- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
- (NSString *)stringValue;
- (NSComparisonResult)compare:(NSNumber *)otherNumber; - (BOOL)isEqualToNumber:(NSNumber *)number;


三、NSValue的介绍和使用

1、NSValue的介绍

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


2、结构体和NSValue的转换

将结构体包装成NSValue对象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;


不能直接放NSPoint类型的数据在数组中

3、常用方法

1、+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; 创建一个NSValue
value:对象地址 objCType:通常是一个用来描述对象类型和大小的字符串,@encode可以接受一个数据类型 的名称自动生成一个合适的描述字符串
2、- (void)getValue:(void *)value(出参);
从接受value的对象中取数值取的数值,存放在这个指针所指向的内存块里。
typedef struct { int year;
int month;
int day; } Date;
Date d = {2015, 2, 1};
// 将结构体d包装成NSValue对象
NSValue *dValue = [NSValue valueWithBytes:&d objCType:@encode(Date)];
NSArray *array = @[dValue];
// 取出value之前包装的结构体数据 Date newD;
[dValue getValue:&newD];


4、NSDate的介绍和使用

4、1基本使用

NSDate可以用来表示时间, 可以进行一些常见的日期\时间处理 一个NSDate对象就代表一个时间
[NSDate date]返回的就是当前时间 ,获取当前时区的时间

NSDate *d = [NSDate date];
NSLog(@"d = %@",d);
//设置时区
NSTimeZone *zone = [NSTimeZone systemTimeZone]; //设置时间间隔
NSInteger interval = [zone secondsFromGMTForDate: d]; //重新生成时间
NSDate *localeDate = [d dateByAddingTimeInterval: interval]; NSLog(@"%@", localeDate);


4.2、格式化日期

//定义NSDate
NSDate *d1 = [NSDate date];
//定义日期时间格式化的类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
//把Date转换为dataStr
NSString *dateStr = [formatter stringFromDate:d1];
// 设置格式
// fmt.dateFormat = @"今天 HH:mm";
// HH : 24小时制
// hh : 12小时制
// yyyy : 年
// MM : 月
// dd : 号
// mm :分钟
// ss : 秒
// Z : 时区
fmt.dateFormat = @"yyyy年MM月dd号 hh:mm:ss Z";
dataString ----->Date
//定义日期时间格式化的类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
//把dataStr转换为Date
NSDate *date = [formatter dateFromString:@"2015-02-01 02:30:19"];
NSLog(@"%@",date);


4.3、计算日期

//1)明天的此刻
NSTimeInterval secondsPerDay = 24*60*60;
NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:secondsPerDay]; NSLog(@"myDate = %@",tomorrow);
//2)昨天的现在
NSTimeInterval secondsPerDay1 = 24*60*60;
NSDate *now = [NSDate date];
NSDate *yesterDay = [now addTimeInterval:-secondsPerDay1]; NSLog(@"yesterDay = %@",yesterDay);


4.4、日期时间对象

获得NSCalendar对象
NSCalendar *calendar = [NSCalendar currentCalendar]; 获得年月日
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
//创建日期
NSDate *d = [NSDate date];
//创建日期对象
NSCalendar *ca = [NSCalendar currentCalendar];
//获得时间组件
NSDateComponents *cms= [ca components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:d];
NSLog(@"%ld-%ld-%ld",cms.year,cms.month,cms.day);
比较两个日期的差距
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *) startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
NSString *time1 = @"2014-04-08 20:50:40"; NSString *time2 = @"2014-04-04 18:45:30";
NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date1 = [fmt dateFromString:time1]; NSDate *date2 = [fmt dateFromString:time2];
// 1.创建一个日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 2.比较时间的差距
int unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay
| NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; NSDateComponents *cmps = [calendar components:unit fromDate:date2 toDate:date1 options:0];
NSLog(@"相差%ld年%ld月%ld天%ld小时%ld分钟%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: