Foundation框架—NSNumber、NSValue、NSDate

一、NSNumber 这个类主要是用来封装基本类型的

1. OC中的集合是不允许存入基本类型的,这就需要我们将基本类型进行封装下,然后存进去。这个方法类似于Java中的自动装箱和卸箱,Java中的集合其实也是不允许存入基本类型的,但是我们仍然可以那么操作,就是因为有自动装箱功能。

    NSNumber 是 NSValue 的子类,但是NSNumber 只能包装数字类型(基本数据类型)不过NSValue可以包装任意类型。也就是可以用NSValue包装结构体、枚举等后在加入NSArrar、NSDictionary 等集合中。

  注意: 那为什么基本数据类型不能存入到集合中呢?

  答: 原因是因为在操作集合的时候会操作集合中的元素中的方法,但是基本数据类型是没有方法的。

//包装基本数据类型  
int main(int argc, const charchar * argv[]) {  
    @autoreleasepool {  
        //1.----------------创建NSNumber  
        //封包  
        NSNumber *intNumber = [NSNumber numberWithInt:3];  
        NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f];  
        NSArray *array = @[intNumber,floatNumber];  
          
        //解包  
        int value = [intNumber intValue];  
        float values = [floatNumber floatValue];  
        NSString *str = [intNumber stringValue];  
          
        //优化语法  
        NSNumber *intNumbers = @12;  
          
          
        //如何将结构体存入到数组中  
        //使用NSValue对结构体进行封装  
        //NSValue是NSNumber的父类  
        //封包  
        NSRange rang = {1,3};  
        NSValue *v = [NSValue valueWithRange:rang];  
          
        //解包  
        rang = [v rangeValue];  
          
          
        //对自定义的结构体进行封包  
        struct WXPoint{  
            float x;  
            float y;  
        };  
          
        struct WXPoint p = {50,100};  
        //第一个参数是结构体的变量地址,第二个参数是类型  
        NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];  
          
        //解包  
        struct WXPoint p1;  
        [v1 getValue:&p1];  
          
          
        //NSNULL的使用  
        //数组中是没有办法存放一个空对象的nil  
        //NSArray *nilArray = @[nil,nil,nil];//报错的  
        //有时候我们需要在数组中存入一个空对象的需求  
        NSNull *n1 = [NSNull null];  
        NSNull *n2 = [NSNull null];  
        NSArray *nullArray = @[n1,n2];  
        NSLog(@"nullArray =%@",nullArray);  
          
          
    }  
    return 0;  
}

实例2:

/ NSNumber可以讲一些数据类型包装成对对象,其实就是一个包装类
// 类名一般都会有自己的静态方法,而且一般是以类名开头。numberwith.....
void number() {
    // 将int类型的100 包装成 一个NSNumber对象
    NSNumber *number = [NSNumber numberWithInt:100];
    NSLog(@"number = %@", number);
    
    NSMutableArray *array = [NSMutableArray array];
    // 添加数值到集合中(数组或是字典)
    [array addObject:number];
    
    // 取出来的还是一个NSNumber对象,不支持自动解包(也就是自动转化为int类型)
    NSNumber *number1 = [array lastObject];
    NSLog(@"number1 = %@", number1);   // 打印的是对象
    int num = [number1 intValue ];
    NSLog(@"num = %i", num);   // 打印的是数据
    
}
2. 在OC中还有一个结构体类型,他也是不能直接存入到集合类中的,对他进行封装的时 NSValue类,不是NSNumber类了

//对自定义的结构体进行封包
struct WXPoint{
    float x;
    float y;
};

struct WXPoint p = {50,100};
//第一个参数是结构体的变量地址,第二个参数是类型
NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)];

//解包
struct WXPoint p1;
[v1 getValue:&p1];

实例2:

// 系统自带的结构体 cg = ns
void structCreat() {
    CGPoint point = CGPointMake(10, 10);
    // 把一个结构体变量包装成一个包
    NSValue *value = [NSValue valueWithPoint:point];
    
    // 添加到数组中
    NSMutableArray *array = [NSMutableArray array];
    // 添加value
    [array addObject:value];
    
    // 取出当时放进去的value
    NSValue *value1 = [array lastObject];
    CGPoint point1 = [value1 pointValue];
    
    BOOL result = CGPointEqualToPoint(point1, point);
    NSLog(@"result = %i", result);
    
    
}
// 自定义结构体包装
typedef struct {
    int year;
    int month;
    int day;
}Date;

void value2() {
    Date date = {2015, 10, 10};
    // 这里传的是地址 由于指针存的是地址
    // 根据结构体类型生成 对应的 类型描述字符串
    char *type = @encode(Date);
    
    NSValue *value3 = [NSValue value: &date withObjCType:type];
    //定义一个结构体变量
    Date date1;
    
    //取出包装好的结构体
    [value3 getValue:&date1];
    
    NSLog(@"year = %i, month = %i, day = %i", date1.year, date1.month, date1.day);
}
  对于自定义的结构体类型,我们在封包的时候需要使用value:withObjCType:方法来进行操作了,需要使用 @encode(struct WXPoint)传递进去,这个作用就是相当于把结构体类型传递过去。

记住:在对自定义结构体类型进行封包的时候需要传递结构体类型

二、NSDate 这个类主要是用来封装基本类型的

1. 这个类是OC中操作日期的类,他的用处也是很多的,后面会说到的定时器等。就会用到这个类

实例1:

void dataFun() {
    // data方法返回的就是当前时间
    NSData *date = [NSDate date];
    
    // now 11:11:11
    // date 11:11:21
    date = [NSDate dateWithTimeIntervalSinceNow:10];
    
    //
    date = [NSDate dateWithTimeIntervalSince1970:10];
    
    // 随机返回一个比较遥远的未来时间
    date = [NSDate distantFuture];
    NSLog(@"%@", date);
    // 随机返回一个比较遥远的过去时间
    date = [NSDate distantPast];
    NSLog(@"%@", date);
    
}
#pragma mark DATA 将时间转化为字符串
void dateFormat() {  // 将时间转化为字符串
    NSData *date = [NSDate date];
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
    
    NSString *string = [formatter stringFromDate:date];
    NSLog(@"%@", string);
    
    [formatter release];
    
}
实例2:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //1.----------------创建日期
        NSDate *date = [NSDate date];//代表当前的时间点
        NSDate *date1 = [[NSDate alloc] init];
        NSLog(@"%@",date);
        
        date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了
        NSLog(@"%@",date);
        
        //时间戳:某个日期到1970年之间的一个差值,这个值是很大的
        NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小
        
        //创建一个日期,然后拿到时间戳
        NSDate *now = [NSDate date];
        NSTimeInterval interval = [now timeIntervalSince1970];
        interval = [now timeIntervalSinceNow];//到当前时间的一个差值
        
        //日期的比较
        //通过调用日期对象的compare,或者通过两个日期之间的差值判断
        NSComparisonResult result = [date compare:date1];
        if(result == NSOrderedAscending){
            //大于
        }else if(result == NSOrderedDescending){
            //小于
        }else{
            //等于
        }
        
        //日期格式化
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSString *str = [dateFormatter stringFromDate:date];
        NSLog(@"%@",str);
        
        
        //设置时区
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
        [dateFormatter setTimeZone:timeZone];
        
        //下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)
        //[NSTimeZone timeZoneForSecondsFromGMT:0];
        
        //通过打印可以得到具体的时区
        NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区
        for(NSString *str in array){
            NSLog(@"%@",str);
        }
        
        
        //将字符串转化成日期对象
        NSString *strs = @"2013年12月14日 16:31:08";
        [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
        date1 = [dateFormatter dateFromString:strs];
        
        
    }
    return 0;
}
  1). 创建一个时间, 默认是当前时间
//1.----------------创建日期
NSDate *date = [NSDate date];//代表当前的时间点
NSDate *date1 = [[NSDate alloc] init];
NSLog(@"%@",date);
  2). 增减时间点
date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了
NSLog(@"%@",date);
// 方法是一个,如果是减去时间的话,直接用赋值
  3). 创建一个日期,然后获取他的时间戳
//创建一个日期,然后拿到时间戳
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
interval = [now timeIntervalSinceNow];//到当前时间的一个差值
  4). 设置时区
//设置时区
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
[dateFormatter setTimeZone:timeZone];
看看时间区值该怎么获取:
//下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0)
//[NSTimeZone timeZoneForSecondsFromGMT:0];

//通过打印可以得到具体的时区
NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区
for(NSString *str in array){
    NSLog(@"%@",str);
}

感谢(文章主要部分来源):http://blog.csdn.net/jiangwei0910410003/article/details/41852835
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值