iOS技术文章

Foundation框架中的NSNumber,NSDate, N

2016-06-24  本文已影响103人  LeaderBiao
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。

Foundation中的:NSNumber,NSDate,NSException

一.NSNumber数值对象

这个类主要是用来封装基本类型的,说到这里,就不得不说一下了:

OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,在很多类使用的时候,如果使用数值,就需要将数值转换成对象类型,而基本数据类型是无法使用的,所以说我们就要封装基本数据类型变为对象类型,数值对象的常用处理方式和使用与基本数据类型无差别。
注:那为什么基本类型不能存入到集合中呢?
原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有方法的。
从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到。

#import <Foundation/Foundation.h>  
  
//包装基本数据类型  
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 BBPoint{  
            float x;  
            float y;  
        };  
          
        struct BBPoint p = {10,100};  
        //第一个参数是结构体的变量地址,第二个参数是类型  
        NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct BBPoint)];  
          
        //解包  
        struct BBPoint 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;  
}  ```

- 1、封包和解包

//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类中有基本类型对应的方法,可以这么操作的,不过值得一提的是:
NSString *str = [intNumber stringValue];  
NSLog(@"%@",str);  ```

>我们看到,intNumber是用包装int类型的,但是我们可以使用stringValue方法进行解包,这个就相当于int类型转化成NSString类型了,这个需要注意了,同样反过来也是可以的。

- 运行结果:
![](https://img.haomeiwen.com/i838345/5e728edff6dd3636.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 2、优化创建方式

//优化语法
NSNumber *intNumbers = @12; ```

貌似和创建字符串方式很类似。

  /*
   *如何将结构体存入到数组中  
   *使用NSValue对结构体进行封装  
   *NSValue是NSNumber的父类
   */
//封包  
NSRange rang = {1,3};  
NSValue *v = [NSValue valueWithRange:rang];  
  
//解包  
rang = [v rangeValue];  ```

>在OC中还有一个结构体类型,他也是不能直接存入到集合类中的,对他进行封装的时NSValue类,不是NSNumber类了。

- 4、对自定义结构体类型进行自动封包和解包

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

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

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

对于自定义的结构体类型,我们在封包的时候需要使用value:withObjCType:方法来进行操作了,需要使用@encode(struct BBPoint)传递进去,这个作用就是相当于把结构体类型传递过去。

记住:在对自定义结构体类型进行封包的时候需要传递结构体类型
/*
 *NSNULL的使用  
 *数组中是没有办法存放一个空对象的nil  
 *NSArray *nilArray = @[nil,nil,nil];//报错的  
 *有时候我们需要在数组中存入一个空对象的需求    
 */
NSNull *n1 = [NSNull null];  
NSNull *n2 = [NSNull null];  
NSArray *nullArray = @[n1,n2];  
NSLog(@"nullArray = %@",nullArray);  ```

>首先我们要了解一下,为什么会有这么需求:需要将空值存入到集合中,我们后面会说到具体的应用,那么这里需要使用`NSNull`来进行封包和解包

###二、NSDate

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

import <Foundation/Foundation.h>

int main(int argc, const charchar * 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.NSDate存储的是时间信息,默认存储的是世界标准时间(UTC),输出时需要根据时区转换为本地时间。中国大陆、香港、澳门、台湾…的时间增均与UTC时间差为+8,也就是UTC+8。
2.初始化 得到当前的时间

   NSDate* date = [[NSDate alloc]init];```
3.得到一个时间,和当前比延迟30秒

NSDate* date2 = [NSDate dateWithTimeIntervalSinceNow:30];```
4.和时间对比 返回秒数

  NSTimeInterval second = [date timeIntervalSince1970];```
5.比较两个时间 哪个更早
        NSDate* earlierDate = [date earlierDate:date2];  
6.比较两个时间 哪个更晚
        NSDate* laterDate = [date laterDate:date2];
7.将世界标准时间转换成当地时间
8.将UTC时间转换为当地时间
  -   a.创建模板对象
    NSDateFormatter* dateFormatter
    =[[NSDateFormatter alloc]init];
    //hh12小时制mm分钟ss秒 HH24小时制
    //MM月dd日yyyy年
    dateFormatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";```
        NSString* strDate = [dateFormatter stringFromDate:date];```




import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
NSDate存储时间信息,默认存储的是世界标准时间UTC,与中国大陆,香港,台湾,澳门有八个小时的时差,UTC+8
*/
//获取当前时间
NSDate *date = [NSDate date];
NSLog(@"date:%@",date);
//获取一个比当前晚的时间,比当前快30秒
NSDate *date1 = [NSDate dateWithTimeIntervalSinceNow:30];
NSLog(@"date1:%@",date1);
//获取一个比当前早30秒的时间,也就是慢30秒的时间
NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:-30];
NSLog(@"date2:%@",date2);

    //获取时间的间隔
    //获取两个时间之间的间隔
    NSTimeInterval time = [date1 timeIntervalSinceDate:date2];
    NSLog(@"%lg",time);
    //从1970年1月1日开始至今经历的秒数
    NSTimeInterval time1 = [date timeIntervalSince1970];
    NSLog(@"%lg",time1);
    //从1970年1月1日开始经历3600秒的一个时间
    NSDate *date3 = [NSDate dateWithTimeIntervalSince1970:3600];
    NSLog(@"date3:%@",date3);
    
    NSTimeInterval time2 = [date3 timeIntervalSinceNow];
    NSLog(@"%lg",time2);
    
    //按指定的格式输出时间
    //1.创建一个时间的格式化对象
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    //2.指定时间的转换格式
    //HH表示24小时制,hh表示12小时制
    formatter.dateFormat = @"yyyy年MM月dd日 HH:mm:ss";
    //日期转字符串
    NSString *dateString = [formatter stringFromDate:[NSDate date]];
    NSLog(@"%@",dateString);
    //字符串转日期
    NSDate *date4 = [formatter dateFromString:dateString];
    NSLog(@"%@",date4);
    
    //时间的比较
    //比较哪个时间早
    NSDate *early = [date3 earlierDate:date4];
    NSLog(@"-------%@",early);
    //获取较晚的时间
    NSDate *later = [date3 laterDate:date4];
    NSLog(@"%@",later);
    
    //判断两个时间是否相同isEqualToDate:
    if ([date3 isEqualToDate:date4]) {
        NSLog(@"两个时间相同");
    }else {
        NSLog(@"两个时间不同");
    }
    
    
    
    
}
return 0;

}


- 打印出来的结果:
![](https://img.haomeiwen.com/i838345/3f1e1892f5836d4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


######获取具体的时区值

- 如图:
![](https://img.haomeiwen.com/i838345/ed56a48f1c944a53.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)





###三、NSException
>NSException类用于捕获异常的,增加程序的健壮性,用法很简单,如下:

import <Foundation/Foundation.h>

int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//捕获异常
@try {
int a = 1/0;
}
@catch (NSException *exception) {

    }  
    @finally {  
          
    }  
}  
return 0;  

} ```

总结

这一篇就介绍了Foundation框架中的三个常用的类:NSNumber/NSDate/NSException,那么到这里我们对Foundation中的类的解读也算是告一段落了,其实Foundation中还有其他类,后面会用到,用多了自然就知道他怎么用的了。

上一篇下一篇

猜你喜欢

热点阅读