![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
上QQ阅读APP看书,第一时间看更新
4.5 NSNumber类
在编程的过程中,一些基本数据类型的变量是必不可少的,但是在Objective-C编程语言当中,Objective-C的消息机制并不能向这些基本数据类型发送消息,而且Objective-C的集合(如:数组)当中是不能存放基本数据类型的,所以就需要将基本数据类型转化成对象来使用。Objective-C中提供了NSNumber类来将基本数据类型“包装”成数字对象,这样就可以将基本数据类型当做对象来处理了。
1.NSNumber对象创建
当需要把基本数据类型转换成NSNumber类型的对象时,转换方式通常有以下两种。
- 使用@符号进行快速封装。
- 调用NSNumber类提供的方法。通过调用NSNumber类中提供的方法,NSNumber类型的对象不仅仅可以转换int、float、double这些常规的基本数字类型,还可以包装char、BOOL。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T106_12796.jpg?sign=1739261599-NItSoL9USupfE2QsCXa2dZ2dFUtGmK3Y-0-51a18134052d5c4cb9d8c2b0f16c4243)
下方的示例代码中演示了常用的基本数据类型转换成NSNumber对象的方法,当需要打印NSNumber对象时,在NSLog()中需要使用%@。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T107_12939.jpg?sign=1739261599-5DqV4i2vbxk1Y0jdc2aCrQcbQsroDpzZ-0-94ef0a2444f72846378e7ae7ba653e7c)
运行结果如图4-19所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P107_12941.jpg?sign=1739261599-nBKJvkAgxWa4QXQeUnBLhldBfhplwe29-0-1828d80a4da87637bb2b986a191462c6)
图4-19 运行结果
2.NSNumber对象与基本数据类型之间的转换
基本数据类型可以转换为NSNumber类的对象,NSNumber类的对象也可以转换成基本数据类型,在NSNumber类中也提供了对应的属性与方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T107_12945.jpg?sign=1739261599-FS9PhpW5ErunoeEQQkEfoxmWaymCnLU4-0-c766f16ef7cbe437ee9844f5d79e4623)
下方的示例代码演示了如何把NSNumber对象转换成其他基本数据类型。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T107_12947.jpg?sign=1739261599-NjtPUzRVNvNoewit6tLcNhrnZS3rrbn0-0-6fe6e9bb65fbcc8bfb14be249413f6e6)
运行结果如图4-20所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P108_13048.jpg?sign=1739261599-0cVOlimU5pkeMEs4AGz1IENj2Fgdd588-0-424d0fee5e48414e066142c09a3ad147)
图4-20 运行结果
3.int、NSInteger与NSNumber的对比
- 当使用int类型定义变量时,可以像写C程序一样去使用。当程序员不知道程序运行在哪种处理器架构时,最好使用NSInteger,因为int在32位系统中也许只是int类型,而在64位系统中int可能变成long型。除非不得不使用int/long型,否则推荐使用NSInteger。
- NSInteger/NSUInteger是一种动态定义的类型,在不同的设备,不同的架构,有可能是int类型,也有可能是long类型。NSUInteger是无符号的,即没有负数,而NSInteger是有符号的。
- NSInteger是基础类型。NSNumber是一个类。如果需要在数组中存储一个数值,直接使用NSInteger是不行的,因为Objective-C的集合当中存储的数据必须是对象。