The size of integers 整数的大小

到目前为止,我们所有的例子里面用的数据类型都是 Int,因为它是你在 Swift 里非常熟悉的数据类型,但随着练习的深入,我们要介绍另外一种不同的数据类型 NSInteger。它们之间的区别有些微妙,前几年的时候,这个区分不是那么重要。但是时至今日,这一点就变得重要了起来,并且不仅在 Objective-C ,在 Swift 中同样重要。所以说,如果你在 Swift 中对数据的大小,了解不是很深的话,这篇就非常值得好好读一读了。

第一代 iPhone 发布的时候,它的 CPU 是 32 位,也就是说在储存数据的时候,存的是 32 位的二进制。但是从 iPhone5s 开始,CPU 就换成了 64 位的了,也就是说,现在 CPU 里存储的数字是 64 位的二进制。

显然没有人愿意会因为 CPU 是两种类型的,就写两份不同的代码。苹果的解决方案就是用 NSInteger。在 32 位的系统里面使用 32 位数字;在 64 位系统里面使用 64 位数字。NSInteger 广泛使用在苹果的各个系统,iOS, OS X, tvOS and watchOS,也就是说你一定会用到它。

随着技术的发展,越来越多的人把 iOS 设备升级到了64位,所以这个区别慢慢变得不那么重要了。但是如果,你在 iCloud 上存了一个整数数组,然后用户同时用一个 64 位的 iPhone 和一个 32 位的 iPad 访问了这个数组。如果这个 iPhone 修改了数组,写了一个 64 位的整数,那 iPad 就无法读取了。

在这种情况下,你就要同时跟 64 位和 32 位的设备打交道,使用 NSInteger 这个类型就不行了。你就要确切地使用 int32_t 或者 int64_t 。在这个层面上,你就不能再无视 CPU 的类型。

同样的问题也会出现在浮点数上面,就像 Swift 和 Objective-C 都有 float 和 double 类型,用来保存双精度和单精度的数,同时也有 CGFloat 这个类型,可以根据 CPU 的不同来选择用何种浮点数。

所以概括一下就是,在绝大多数情况下面你要使用 NSInteger 和 CGFloat。但是当你要在不同的平台储存数据,或者要使用数据类型有精确要求的 API 的时候,就要慎重选择你所用的数据类型。

results matching ""

    No results matching ""