IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    jiangwei0910410003发表于 2014-12-10 22:20:51
    love 0

    前一篇说到了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是很重要的,后面一定会经常用到。

    //
    //  main.m
    //  21_NSNumber
    //
    //  Created by jiangwei on 14-10-12.
    //  Copyright (c) 2014年 jiangwei. All rights reserved.
    //
    
    #import Foundation.h>
    
    /包装基本数据类型
    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 Foundation.h>
    
    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 Foundation.h>
    
    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中还有其他类,后面会用到,用多了自然就知道他怎么用的了。
















沪ICP备19023445号-2号
友情链接