美文网首页iOS技术文章
Foundation框架中的NSNumber,NSDate, N

Foundation框架中的NSNumber,NSDate, N

作者: LeaderBiao | 来源:发表于2016-06-24 11:39 被阅读103次
    • 版权声明:本文为博主原创文章,未经博主允许不得转载。

    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类型了,这个需要注意了,同样反过来也是可以的。
    
    - 运行结果:
    ![](https://img.haomeiwen.com/i838345/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;
    

    }

    
    - 打印出来的结果:
    ![](https://img.haomeiwen.com/i838345/3f1e1892f5836d4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    ######获取具体的时区值
    
    - 如图:
    ![](https://img.haomeiwen.com/i838345/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中还有其他类,后面会用到,用多了自然就知道他怎么用的了。

    相关文章

      网友评论

        本文标题:Foundation框架中的NSNumber,NSDate, N

        本文链接:https://www.haomeiwen.com/subject/rdpodttx.html