`
modabobo
  • 浏览: 508192 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

前一篇说到了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/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/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/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中还有其他类,后面会用到,用多了自然就知道他怎么用的了。














分享到:
评论

相关推荐

    NSNumber-Helper:扩展标准Foundation类功能的NSNumber的总称

    NSNumber的一个扩展名,它扩展了标准Foundation类的功能。 验证方法 + ( BOOL )isInteger:( NSNumber *)number; + ( BOOL )isDouble:( NSNumber *)number; ##操作方法 - ( NSString *)doubleToStringWithFormat:...

    iphone 开发学习基础NSNumber

    object-c基础语法NSNumber, 适合初学者,主要学习NSNumber的设置,NSNumber中可以存储任何的数字类型,以及BOOL和char等

    Foundation(2)

    Foundation学习总结,包括,集合,NSNumber,NSDate和异常处理,希望对大家有所帮助

    【无限互联】iOS开发视频教程课件第四章Foundation框架课件

    【无限互联】iOS开发视频教程课件第四章Foundation框架课件是由无限互联提供的iOS开发视频教程对应的课件,课件非常详细的讲解了Foudation框架里面的常用类和方法。 包括: NSNumber、NSString、NSArray、...

    Objective-C中NSNumber与NSDictionary的用法简介

    主要介绍了Objective-C中NSNumber与NSDictionary的用法简介,虽然Objective-C即将不再是iOS的主流开发语言...well,需要的朋友可以参考下

    OC-练习demo

    1)计算NSArray中所有对象值的和(针对NSString及NSNumber对象) 2)实现查找功能(不使用系统自带查找方法,- (BOOL)containsObject:(id)anObject;使用类目实现其原理) 2、新建Teacher、Student类,并完成下列...

    Foundation帮助文档

    文档中包括: NSNumber,NSArray,NSString,NSDictionary,NSSet 属性以及相关方法

    SecureMappingKit.zip

    SecureMappingKit 可以实现 JSON 数据和 Model 类之间安全的映射。 转换器包括: NSNumberTransformer, NSBooleanNumberTransformer, to be sure to have a NSNumber of a boolean NSStringTransformer, ...

    JS调用OC代码

    JS 虽然是 OO,但是并没有 class,所以将 JS 对象传到 Obj C 程序里头,除了基本字串会转换成 NSString、基本数字会转成 NSNumber,像是 Array 等其他对象,在 Objective-C 中,都是 WebScriptObject 这个 Class。...

    iOS中json解析出现的null,nil,NSNumber的解决办法

    在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式,通过本文给大家介绍iOS中json解析出现的null,nil,NSNumber的解决办法,感兴趣的朋友参考下

    [Objective-c程序设计].杨正洪等.扫描版

    《Objective-C程序设计》(作者杨正洪、郑齐心、李建国)通过大量的实例系统地介绍了Objective-C语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读本书后,可以掌握Objective-C语言的基本内容,并进行...

    FMDB框架的MOME

    //插入数据使用OC中的类型 text对应为NSString integer对应为NSNumber的整形 这样我们就查询返回了一条数据,那当我们想要查询放返回多条数据怎么办呢?不用愁,之前我就提到了FMDB中的另外一个主要的类,FMResultSet...

    PKLormapping:Object-c和Swift版本SQLite ORM框架

    •支持c中基础类型映射,推荐使用NSNumber进行封装 •支持分页查询,排序 •支持线程池,默认为1,可自定义 •支持多线程并发处理,线程安全 •支持HQL语句 •支持多表联动查询映射 •支持事务处理机制 •支持批量...

    Resort:用于在Objective-C中排序的简单比较器库

    通过compare:方法为Foundation中已经支持顺序的类定义了顺序compare:方法: NSString , NSDate , NSNumber , NSIndexPath以及它们的子类,例如NSMutableString和NSDecimalNumber 。 在其他情况下,比较器仅对...

    用 oc 封装的栈,队列,优先队列,使用方法在 ViewController.m 中

    int b1 = [(NSNumber *)obj1 intValue]; int b2 = [(NSNumber *)obj2 intValue]; return b1 &gt; b2 ? true : false; // b1 &gt; b2 返回 true 表示升序 }]; for (int i=0; i; i++) { int x = arc4random() % 100; ...

    OCGeneric:Objective-C中的基础通用支持

    OCGeneric Objective-C的基础通用支持。 包括OCGenerics.h ...当您要将NSNumber对象添加到NSString数组中时,Xcode将找出错误的类型 扩展名 您可以基于此进行扩展,方法是在OCGenerics.h中添加更

    整合多个常用控件案例

    源码BFKit,BFKit对常用于开发的类进行了扩展,整合了多个常用的控件和开发所需要的功能,是一个通用性的类库。集成后可以帮助更快的App开发。有兴趣的同学可以看看哦。 使用方法: 复制文件夹BFKit,添加依赖库...

    斯坦福大学斯坦福大学教程2011秋.(3.Objective-C).pdf

    Interface Builder,App Store,framework,dot notation,initialization,object typing,introspection,selector,foundation framework,NSString,NSMutableString,NSNumber,NSDictionary,NSValue,NSData...

Global site tag (gtag.js) - Google Analytics