博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion) ...
阅读量:5061 次
发布时间:2019-06-12

本文共 7899 字,大约阅读时间需要 26 分钟。

前一篇说到了Foundation框架中的NSDirctionary类:,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException

注:其实按照Java中集合的思想,应该还有一个Set,是的,OC中有NSSet和NSMutableSet这两个类的,但是,这里我为什么不单独介绍了呢?因为他的操作和NSArray是非常相似的,只是他和NSArray有一个区别就是他不能放重复数据,而且他也是无序的。其他没什么了,所以就不单独介绍了,而且NSSet在后面的开发过程中用到的可能不是很多。

1、NSNumber

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

OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗。。

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

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

从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到。

////  main.m//  21_NSNumber////  Created by jiangwei on 14-10-12.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import 
//包装基本数据类型int main(int argc, const char * 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;}

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

运行结果:

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

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

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中操作日期的类,他的用处也是很多的,后面会说到定时器,就会用到这个类

////  main.m//  22_NSDate////  Created by jiangwei on 14-10-12.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import 
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、从1970年开始到现在的时间戳

//时间戳:某个日期到1970年之间的一个差值,这个值是很大的NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小
计算机中有一个特别的时间:1970年,这个是时间戳的开始点,系统时钟都是相对于这个时间点来计算的。

4、创建一个日期,然后获取他的时间戳

//创建一个日期,然后拿到时间戳NSDate *now = [NSDate date];NSTimeInterval interval = [now timeIntervalSince1970];interval = [now timeIntervalSinceNow];//到当前时间的一个差值
这个时间戳就是和1970年相比,比他早多少个值,这就是俗称的时间戳

5、日期的比较

//日期的比较//通过调用日期对象的compare,或者通过两个日期之间的差值判断NSComparisonResult result = [date compare:date1];if(result == NSOrderedAscending){    //大于}else if(result == NSOrderedDescending){    //小于}else{    //等于}
6、日期的格式化(日期转化成字符串)

//日期格式化NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];NSString *str = [dateFormatter stringFromDate:date];NSLog(@"%@",str);

7、设置时区

//设置时区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);}
这样我们就可以获取具体的时区值了:

8、将字符串转化成日期

//将字符串转化成日期对象NSString *strs = @"2013年12月14日 16:31:08";[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];date1 = [dateFormatter dateFromString:strs];

三、NSException

这个类和Java中的Exception类一样,用于捕获异常的,增加程序的健壮性,用法很简单,如下:

////  main.m//  23_Exception////  Created by jiangwei on 14-10-12.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import 
int main(int argc, const char * argv[]) { @autoreleasepool { //捕获异常 @try { int a = 1/0; } @catch (NSException *exception) { } @finally { } } return 0;}

总结

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

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

转载于:https://www.cnblogs.com/pjdssswe/p/4695984.html

你可能感兴趣的文章
更改git仓库地址
查看>>
有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
查看>>
Recipe 1.4. Reversing a String by Words or Characters
查看>>
Rule 1: Make Fewer HTTP Requests(Chapter 1 of High performance Web Sites)
查看>>
sql注入
查看>>
「破解」Xposed强
查看>>
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>
Python 中 创建类方法为什么要加self
查看>>
关于indexOf的使用
查看>>
【转】JS生成 UUID的四种方法
查看>>
英语单词
查看>>
centos6.8下安装matlab2009(图片转帖)
查看>>
Mongo自动备份
查看>>
求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
查看>>
VMWARE虚拟机无法访问的三种方法分析
查看>>
enq: SQ - contention
查看>>
cer证书签名验证
查看>>
ant 安装
查看>>