027 Foundation框架中的数字类型:NSNmuber
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了027 Foundation框架中的数字类型:NSNmuber 相关的知识,希望对你有一定的参考价值。
看官们,前面章回对Foundation框架做了简单的介绍,本章回中主要介绍该框架中的数字类型,通过本章回的内容你可以获得以下知识:
- 什么是对象类型的数字
- 如何初始化对象类型的数字
- 对象类型的数字与基本类型的数字之间如何转换
- 对象类型的数字如何比较大小
什么是对象类型的数字
在介绍什么是对象类型的数字前,我们先看看NSNumber
这个类,它是Foundation框架中提供的数字类,NSNumber类的对象或者说NSNumber类的实例就是对象类型的数字,与其对应的是int,double等基本数字类型,基本类型不能像类类型一样创建对象,但是基本类型可以定义变量,基本类型定义的变量就是基本类型的数字。如果大家觉得不好理解,可以用基本类型变量和对象类型的数字作对比,毕竟基本类型及其变量是我们非常熟悉的知识。
有看官说:基本类型的数字已经足够使用,为什么要引入对象类型的数字?因为OC是面向对象的编程语言,面向对象编程是它最大的特点,使用基本类型的数字不利于面向对象编程,而且在程序中有些地方必须使用对象类型的数字。比如框架中部分API的参数就必须是对象类型的数字,以及我们在后面结果的数组和集合都需要对象类型的数字。
如何初始化对象类型的数字
明白什么是对象类型的数字后,我们来介绍如何初始化NSNumber对象。NSNumber类提供了numberWithXXX方法,这里的XXX表示int等基本数字类型。下面是一个示例代码:
NSNumber *nsNumberA = [NSNumber numberWithInt: 6];
该代码表示使用int类型的数字6初始化NSNumber对象。
NSNumber的初始化还有另外一种方法,示例代码如下:
NSNumber *nsNumberB = [[NSNumber alloc] initWithInt: 7];
相比较而言第一种方法使用更加方便一些,因为直接使用了类的方法,而不需要定义对象。
对象类型的数字与基本类型的数字之间如何转换
NSNumber的初始化可以看作是把基本类型的数字转换为对象类型的数字。那么如何把对象类型的数字转换为基本类型的数字呢?答案是使用NSNumber的XXXValue方法。这里的XXX表示int等基本数字类型。下面是一个示例代码:
intValue = [nsNumberA intValue];
代码中的nsNumberA对象是我们刚才初始化的对象,使用intValue方法可以把该对象转换为int类型的数值,这种转换有时候也叫获取NSNumber对象中的数值。
在转换时要注意类型匹配,就是说NSNumber对象使用int数值初始化后只能获取到int类型的数值,不能获取double等其它类型的数值,因为类型不匹配。
明白上面的知识后,我们可以从另外一个角度看对象类型:对象类型就是对基本类型的包装,因此有些地方称NSNumber为包装类。学习过Java的看官或者看过我在Talkandroid专栏
中的看官应该记得我们介绍过Java中的包装类。不过OC中的包装类和Java中的包装类不一样,NSNumber可以包装int和char等所有的基本类型,但是Java中的包装类和基本类型是一一对应的,就是说一个基本类型对应一个包装类。其实Foundation框架中也有类似Java包装类的类型,比如与基本类型int对应的NSInteger,但是NSInteger不是包装类,它是基本类型long的宏定义,因此它仍然是基本类型,只是类型名字上比较像包装类而已,大家一定不要被这样的”糖衣炮弹“所迷惑。
如果把NSNumber看作基本类型的包装类,那么把基本类型的数字转换成对象类型的数字就可以看作是装箱,与其相反的过程可以看作是拆箱。最后我想说是的,不管是装箱与拆箱,还是对象类型的数字与基本类型的数字转换,只是叫法不同而已,它们本质上相同的。
对象类型的数字如何比较大小
我们在使用基本类型的数字时经常会对数字的大小做比较,比较的方式是使用关系运算符。对象类型的数字也可以使用关系运算符进行比较,不过不能保证结果的正确性,因此我们最好使用使用专门的方法进行比较操作。NSNumber类提供的比较方法是isEqualToNumber
和compare
,它们的声明如下:
(BOOL)isEqualToNumber:(NSNumber *)number;
(NSComparisonResult)compare:(NSNumber *)otherNumber;
这两个方法都可以对两个NSNumber类型的对象进行比较,并且返回比较结果,isEqualToNumber返回的比较结果是布尔值,如果两个对象相等返回YES,否则返回NO.
compare返回的比较结果是枚举值,可以直接使用枚举常量来判断比较结果,这个从枚举常量的名字上就可以看出来。下面是官方代码中给出的解释以及返回的枚举值。
/*
Given the function:
NSComparisonResult f(int a, int b)
If:
a < b then return NSOrderedAscending. The left operand is smaller than the right operand.
a > b then return NSOrderedDescending. The left operand is greater than the right operand.
a == b then return NSOrderedSame. The operands are equal.
*/
typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult) {
NSOrderedAscending = -1L,
NSOrderedSame,
NSOrderedDescending
};
最后,我们对本章回的内容做一个总结:
- 1.对象类型NSNumber与基本类型相对应,可以看作是基本类型的包装类,不过它是所有基本类型的包装类,是一对多的关系;
- 2.对象类型的数字和基本类型的数字可以进行转换(装箱与拆箱),转换时使用专门的方法;
- 3.对象类型的数字比较大小时不能使用关系运算符,需要使用专门的方法;
看官们,欲知后事如何且听下回分解!
以上是关于027 Foundation框架中的数字类型:NSNmuber 的主要内容,如果未能解决你的问题,请参考以下文章