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类提供的比较方法是isEqualToNumbercompare,它们的声明如下:

(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.对象类型的数字比较大小时不能使用关系运算符,需要使用专门的方法;

看官们,欲知后事如何且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值