- 版权声明:本文为博主原创文章,未经博主允许不得转载。
Foundation中的:NSNumber,NSDate,NSException
一.NSNumber数值对象
这个类主要是用来封装基本类型的,说到这里,就不得不说一下了:
OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,在很多类使用的时候,如果使用数值,就需要将数值转换成对象类型,而基本数据类型是无法使用的,所以说我们就要封装基本数据类型变为对象类型,数值对象的常用处理方式和使用与基本数据类型无差别。
注:那为什么基本类型不能存入到集合中呢?
原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有方法的。
从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到。
#import
//包装基本数据类型
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
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
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
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中还有其他类,后面会用到,用多了自然就知道他怎么用的了。