Foundation框架之数字对象
数字对象
Foundation框架提供了一些基本对象,这些对象包括数字,字符串和集合,以及数组,字典,和集合形式使用的成组对象。今天主要讨论其一:数字对象
数字对象
int型, float型,和long型都是OC的基本数据类型, 但是它们都不是对象。也就是说,不能够向它们发送消息。然而,有时需要将这些值作为对象使用。比如,使用Foundation的NSArray对象创建一个数组,它要求存储的值必须是对象,因此,不能将任何基本数据类型直接存储在数组中,如果需要存储基本数据类型(包括char数据类型),可以使用NSNumber类,它会根据这些数据的类型创建对象。
NSNumber类包含多个方法,可以使用初始值创建NSNumber对象,例如语句
NSNumber *intNumber;
intNumber = [NSNumber numberWithInteger: 100];
表示创建一个值为100的整数对象
从NSNumber对象获得的值和存储在对象中的值类型一致,因此,下面这条语句
NSInteger myInt;
myInt = [intNumber integerValue];
获取存储在intNumber中的整数值,将它存储在NSInteger变量myInt中。需要注意的是,这里的NSInteger不是一个对象,而是基本数据类型的typedef。NSUInteger也是类似的typedef,在程序中表示无符号整数。以下给出解释:可以这么理解看出它与64位的long或者32为的int的区别:
NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。
定义的代码类似于下:
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
对于每种基本数据类型,类方法都能为它创建一个NSNumber对象,并设置为指定的值,这些方法以numberWith开头,紧接数据的类型,如numberWithLong:, numberWithFloat:等,此外,可以使用实例方法将以前创建的 NSNumber对象设置为指定的值,这些都是以initWith开头的,如initWithLong:和initWithFloat:等
比较对象的数值大小的两种方法:
isEqualToNumber:
isEqualToNumber:方法用于比较两个NSNumber对象的数值。程序会返回一个BOOL值,查看这两个值是否相等。使用方法如下:
if ([intNumber isEqualToNumber: floatNumber] == YES) {
...
} else {
...
}
该代码用于判断intNumber的值是否与floatNumber的值相等
compare:
可以使用compare:方法测试一个值是否在数值上小于,等于或大于另一个值,如消息表达式:
[intNumber compare: myNumber]
intNumber的值小于myNumber的值时,返回NSOrderedAscending;
如果这两个数刚好相等,则返回NSOrderdSame;
如果第一个值大于第二个值,则返回NSOrderedDescending。
使用方法如下:
if ([intNumber compare: myNumber] == NSOrderedAscendling) {
...
} else {
...
}