Foundation框架中的NSNumber,NSDate, NSException☀️

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。

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类型了,这个需要注意了,同样反过来也是可以的。

- 运行结果:
![](http://upload-images.jianshu.io/upload_images/838345-5e728edff6dd3636.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 2、优化创建方式

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

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

  • 3、结构体类型的自动封包和解包
  /*
   *如何将结构体存入到数组中  
   *使用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)传递进去,这个作用就是相当于把结构体类型传递过去。

记住:在对自定义结构体类型进行封包的时候需要传递结构体类型
  • 5、对空值进行封装
/*
 *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、创建一个日期

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";```
  • b.通过模板对象 将时间对象转换成字符串
    
        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;

}


- 打印出来的结果:
![](http://upload-images.jianshu.io/upload_images/838345-3f1e1892f5836d4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


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

- 如图:
![](http://upload-images.jianshu.io/upload_images/838345-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中还有其他类,后面会用到,用多了自然就知道他怎么用的了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容