OC学习篇之

前一篇说到了Foundation框架中的NSDirctionary类:http://blog.csdn.net/jiangwei0910410003/article/details/41830179,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException

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

1、NSNumber

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

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

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

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

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

1// 2// main.m 3// 21_NSNumber 4// 5// Created by jiangwei on 14-10-12. 6// Copyright (c) 2014年 jiangwei. All rights reserved. 7// 8 9#import <Foundation/Foundation.h> 10 11//包装基本数据类型 12int main(int argc, const char * argv[]) { 13 @autoreleasepool { 14 //1.----------------创建NSNumber 15 //封包 16 NSNumber *intNumber = [NSNumber numberWithInt:3]; 17 NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f]; 18 NSArray *array = @[intNumber,floatNumber]; 19 20 //解包 21 int value = [intNumber intValue]; 22 float values = [floatNumber floatValue]; 23 NSString *str = [intNumber stringValue]; 24 25 //优化语法 26 NSNumber *intNumbers = @12; 27 28 29 //如何将结构体存入到数组中 30 //使用NSValue对结构体进行封装 31 //NSValue是NSNumber的父类 32 //封包 33 NSRange rang = {1,3}; 34 NSValue *v = [NSValue valueWithRange:rang]; 35 36 //解包 37 rang = [v rangeValue]; 38 39 40 //对自定义的结构体进行封包 41 struct WXPoint{ 42 float x; 43 float y; 44 }; 45 46 struct WXPoint p = {50,100}; 47 //第一个参数是结构体的变量地址,第二个参数是类型 48 NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)]; 49 50 //解包 51 struct WXPoint p1; 52 [v1 getValue:&p1]; 53 54 55 //NSNULL的使用 56 //数组中是没有办法存放一个空对象的nil 57 //NSArray *nilArray = @[nil,nil,nil];//报错的 58 //有时候我们需要在数组中存入一个空对象的需求 59 NSNull *n1 = [NSNull null]; 60 NSNull *n2 = [NSNull null]; 61 NSArray *nullArray = @[n1,n2]; 62 NSLog(@"nullArray =%@",nullArray); 63 64 65 } 66 return 0; 67}

1、封包和解包

1//1.----------------创建NSNumber 2//封包 3NSNumber *intNumber = [NSNumber numberWithInt:3]; 4NSNumber *floatNumber = [NSNumber numberWithFloat:9.8f]; 5NSArray *array = @[intNumber,floatNumber]; 6 7//解包 8int value = [intNumber intValue]; 9float values = [floatNumber floatValue]; 10NSString *str = [intNumber stringValue];

NSNumber类中有基本类型对应的方法,可以这么操作的,不过值得一提的是:

1NSString *str = [intNumber stringValue]; 2NSLog(@"%@",str);

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

运行结果:

2、优化创建方式

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

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

3、结构体类型的自动封包和解包

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

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

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

1//对自定义的结构体进行封包 2struct WXPoint{ 3 float x; 4 float y; 5}; 6 7struct WXPoint p = {50,100}; 8//第一个参数是结构体的变量地址,第二个参数是类型 9NSValue *v1 = [NSValue value:&p withObjCType:@encode(struct WXPoint)]; 10 11//解包 12struct WXPoint p1; 13[v1 getValue:&p1];

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

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

5、对空值进行封装

1//NSNULL的使用 2//数组中是没有办法存放一个空对象的nil 3//NSArray *nilArray = @[nil,nil,nil];//报错的 4//有时候我们需要在数组中存入一个空对象的需求 5NSNull *n1 = [NSNull null]; 6NSNull *n2 = [NSNull null]; 7NSArray *nullArray = @[n1,n2]; 8NSLog(@"nullArray =%@",nullArray);

首先我们要了解一下,为什么会有这么需求:需要将空值存入到集合中,我们后面会说到具体的应用

那么这里需要使用NSNull来进行封包和解包

二、NSDate

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

1// 2// main.m 3// 22_NSDate 4// 5// Created by jiangwei on 14-10-12. 6// Copyright (c) 2014年 jiangwei. All rights reserved. 7// 8 9#import <Foundation/Foundation.h> 10 11int main(int argc, const char * argv[]) { 12 @autoreleasepool { 13 //1.----------------创建日期 14 NSDate *date = [NSDate date];//代表当前的时间点 15 NSDate *date1 = [[NSDate alloc] init]; 16 NSLog(@"%@",date); 17 18 date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了 19 NSLog(@"%@",date); 20 21 //时间戳:某个日期到1970年之间的一个差值,这个值是很大的 22 NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小 23 24 //创建一个日期,然后拿到时间戳 25 NSDate *now = [NSDate date]; 26 NSTimeInterval interval = [now timeIntervalSince1970]; 27 interval = [now timeIntervalSinceNow];//到当前时间的一个差值 28 29 //日期的比较 30 //通过调用日期对象的compare,或者通过两个日期之间的差值判断 31 NSComparisonResult result = [date compare:date1]; 32 if(result == NSOrderedAscending){ 33 //大于 34 }else if(result == NSOrderedDescending){ 35 //小于 36 }else{ 37 //等于 38 } 39 40 41 //日期格式化 42 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 43 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 44 NSString *str = [dateFormatter stringFromDate:date]; 45 NSLog(@"%@",str); 46 47 48 //设置时区 49 NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"]; 50 [dateFormatter setTimeZone:timeZone]; 51 52 //下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0) 53 //[NSTimeZone timeZoneForSecondsFromGMT:0]; 54 55 //通过打印可以得到具体的时区 56 NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区 57 for(NSString *str in array){ 58 NSLog(@"%@",str); 59 } 60 61 62 //将字符串转化成日期对象 63 NSString *strs = @"2013年12月14日 16:31:08"; 64 [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"]; 65 date1 = [dateFormatter dateFromString:strs]; 66 67 68 } 69 return 0; 70}

1、创建一个日期

默认是当前时间

1//1.----------------创建日期 2NSDate *date = [NSDate date];//代表当前的时间点 3NSDate *date1 = [[NSDate alloc] init]; 4NSLog(@"%@",date);

2、增减时间点

1date1 = [NSDate dateWithTimeIntervalSinceNow:1000];//单位是秒,在当前时间加上1000s,如果是减去一个时间,直接使用负值就可以了 2NSLog(@"%@",date);

方法是一个,如果是减去时间点的话,直接用负值

3、从1970年开始到现在的时间戳

1//时间戳:某个日期到1970年之间的一个差值,这个值是很大的 2NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:1000];//参数为时间戳的大小

计算机中有一个特别的时间:1970年,这个是时间戳的开始点,系统时钟都是相对于这个时间点来计算的。

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

1//创建一个日期,然后拿到时间戳 2NSDate *now = [NSDate date]; 3NSTimeInterval interval = [now timeIntervalSince1970]; 4interval = [now timeIntervalSinceNow];//到当前时间的一个差值

这个时间戳就是和1970年相比,比他早多少个值,这就是俗称的时间戳

5、日期的比较

1//日期的比较 2//通过调用日期对象的compare,或者通过两个日期之间的差值判断 3NSComparisonResult result = [date compare:date1]; 4if(result == NSOrderedAscending){ 5 //大于 6}else if(result == NSOrderedDescending){ 7 //小于 8}else{ 9 //等于 10}

6、日期的格式化(日期转化成字符串)

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

7、设置时区

1//设置时区 2NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"]; 3[dateFormatter setTimeZone:timeZone];

但是我们看到这个时区值我们该怎么获取呢?不可能死记硬背呀?这里,我们可以打印一个值:

1//下面的方法是从格林时区开始添加和减去一个时区值(格林时区为0) 2//[NSTimeZone timeZoneForSecondsFromGMT:0]; 3 4//通过打印可以得到具体的时区 5NSArray *array = [NSTimeZone knownTimeZoneNames];//获取所有的时区 6for(NSString *str in array){ 7 NSLog(@"%@",str); 8}

这样我们就可以获取具体的时区值了:

8、将字符串转化成日期

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

三、NSException

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

1// 2// main.m 3// 23_Exception 4// 5// Created by jiangwei on 14-10-12. 6// Copyright (c) 2014年 jiangwei. All rights reserved. 7// 8 9#import <Foundation/Foundation.h> 10 11int main(int argc, const char * argv[]) { 12 @autoreleasepool { 13 //捕获异常 14 @try { 15 int a = 1/0; 16 } 17 @catch (NSException *exception) { 18 19 } 20 @finally { 21 22 } 23 } 24 return 0; 25}

总结

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python之time模块的时间戳、时间字符串格式化与转换

Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y