Numbers 数字

在之前的章节里面,我们已经介绍了 NSInteger 和 int 的区别。回顾一下。int 是 32 位的整数。而 NSInteger 则根据 CPU 的类型,给出 32 位或者 64 位的整数。除此之外,还有一些特殊的数据类型,比如 int64_t 表示的是 64 位的整数,而 NSUInteger 则是无符号的 32 位和 64 位的整数。

上面的这些数据类型,我们统称他为「原始数据」,因为 CPU 直接处理数据本身。与此相对应,有一类「存储数据」,我们把它们叫做 NSNumber ,这两种数据类型是完全不一样的。

最大的区别就是这个,NSNumber 是一个对象,数据储存在这个对象里。 NSInteger 只能放整数,但是在 NSNumber 里面,你可以存整数、浮点数、甚至布尔值。也就是说,可以创建一个整数的 NSNumber ,然后以小数的形式来读取它;或者以布尔值的形式创建它,然后以浮点数的形式读取它。

显然,在数学运算中没必要用对象,实际上在数学的运算中,也不能用 NSNumber ,就像下面这段代码一样,是不会实现的:

NSNumber *third = first + second;

NSNumber 的存在就是为了储存数据,因为 Objective-C 有一个非常坑爹的漏洞,就是数组和字典中只能存储对象,也就是说,你不能在数组中直接放整数,也不能放浮点数和布尔值。

这个问题就很坑了,所以 Objective-C 搞了这个叫 NSNumber 的东西,让我们先把数据存储在里面,然后再放进数组、字典和集合中。

NSNumber 有很多的初始化方式,比如 numberWithInteger 就可以创建一个 NSInteger,然后返回一个 NSNumber 实例。当你读取数据的时候,可以用 floatValue, intValue, 或者 integerValue,就可以读到各种各样的数据类型。

NSNumber *ten = [NSNumber numberWithInteger:10];
float floatTen = [ten floatValue];

当然了,更常用的方法是 @ 符号。你可以在 @ 符号后面直接跟上一个整数,小数或布尔值。编译器就会自动地生成一个 NSNumber 实例。

NSNumber *integerTen = @10;
NSNumber *booleanTrue = @YES;
NSNumber *doublePi = @M_PI;

results matching ""

    No results matching ""