数字对象

Foundation框架包含大量的类和方法和函数。在Max OS下,大约有125个可用的头文件。可以通过

#import <Foundation/Foundation.h>

导入,实际上Foundation.h文件导入了Foundation的所有文件。使用这条语句会增加程序编译的时间。然而,使用预编译的头文件可以避免额外的时间开销。预编译的头文件是编译器预先处理过的文件。

我们所讨论的int ,float 和 long型都是基本数据类型,他们都不是对象。也就是说不能够向他们发送消息。然而,有时候要将这些值作为对象来使用,例如,使用Foundation中的NSArray类来创建数组,它要求存储的值必须是对象,因此,不能够将任何基本数据类型存储到数组中。如果是需要存储基本数据类型,可以使用NSNumber类,它会依据这些数据类型创建对象。

不能修改前面创建的NSNumber对象的值。例如:

NSNumber *myNumber = [[NSNumber alloc] initWithInt: 50 ];

...

[myNumber initWithInt : 1000];

并不能正常运行。程序执行最后一行时,最后一条语句会引起程序崩溃。所有的数字对象都必须是新创建的,这意味着必须对NSNumber类调用创建和初始化方法,或者对alloc方法的结果调用初始化实利的方法。

方法numberWithInt:和numberWithInteger:使用有些差别,遵循一下规则:

1)如果使用numberWithInt:方法创建一个整型数,需要使用intValue获取他们的值,使用%i 作为格式化字符串显示它的值。

2)如果使用numberWithInteger:方法创建一个整型数,需要使用integerValue,也可以转化成long显示或者使用stringWithFormat:将它格式化成字符串,使用%li作为格式化字符串。

方法numberWithUnsignedInt:和numberWithUnsignedInteger:的使用类似。

#import <Foundation/Foundation.h>

int main ()

{

    @autoreleasepool {

        NSNumber *myNumber, *floatNumber, *intNumber;

        NSInteger myInt;

        //Integer型值

        intNumber = [NSNumber numberWithInteger:100];

        myInt = [intNumber integerValue];

        NSLog(@"%li",(long) myInt);

        //long型值

        myNumber = [NSNumber numberWithLong:0xabcdef ];

        NSLog(@"%lx",[myNumberlongValue]);

        //char型值

        myNumber = [NSNumber numberWithChar:119];

        NSLog(@"%c",[myNumbercharValue]);

        //float型值

        floatNumber = [NSNumber numberWithFloat:1123.00];

        NSLog(@"%f",[floatNumberfloatValue]);

        //doubble型值

        myNumber = [NSNumber numberWithDouble:1234e+15];

        NSLog(@"%lg",[myNumberdoubleValue]);

        //发生错误

        NSLog(@"%li",(long) [myNumberintegerValue]);

        //验证两个Number是否相等

        if ([intNumber isEqualToNumber:floatNumber] ==YES) {

            NSLog(@"Number are equal");

        }

        else

            NSLog(@"Number are not equal");

        //验证一个Number是否小于、等于或大于另一个Number

        if ([intNumber compare: myNumber] ==NSOrderedAscending) {

            NSLog(@"First number is less than second");

        }

        

    }

    return 0;

}

运行结果:

2014-08-21 22:34:34.122 testOC[922:303] 100

2014-08-21 22:34:34.123 testOC[922:303] abcdef

2014-08-21 22:34:34.124 testOC[922:303] w

2014-08-21 22:34:34.124 testOC[922:303] 1123.000000

2014-08-21 22:34:34.124 testOC[922:303] 1.234e+18

2014-08-21 22:34:34.125 testOC[922:303] 1234000000000000000

2014-08-21 22:34:34.125 testOC[922:303] Number are not equal

2014-08-21 22:34:34.125 testOC[922:303] First number is less than second

Program ended with exit code: 0

这里注意:NSInteger不是一个类,而是基本数据类型的typedef。它实际上是64位的long或者32位的int。NSUInteger也是类似的typedef,在程序中表示无符号整数。

本段程序尝试使用下列语句获取并显示它的值:

NSLog(@"%li",(long) [myNumber integerValue]);

一般来说,你需要确保使用正确的方式获取对象的值,如果在NSNumber对象中存储了一个值,那么也需要用一般的方式去获取。

在if语句中,消息表达式

[intNumber isEqualToNumber:floatNumber] 

使用了isEqualToNumber:方法比较来个两个NSNumber对象的数值。陈程序会返回一个BOOL值,查看这两个值是否相等。

还可以使用compare:方法测试一个值是否在数值上小于、等于和大于另一个值。当

[intNumber compare: myNumber] 

中intNumber的值小于myNumber的值时,返回NSOrderedAscending;如果这两个数刚好相等,则返回NSOrderedSame;如果第一个值大于第二个值,则返回NSOrderedDescending。再引用Foundation.h时已经包含了NSObject.h头文件。


对于每一种基本数据类型,类方法都能创建一个NSNumber对象,并设置指定为制定值。这些方法以numberWith开头,紧接着数据类型,如:numberWithLong:、numberWithFloat:等。此外,可以使用实力方法将以前创建的NSNumber对象设置为指定的值。这些都是以initWith开头的,如:initWithLong:和initWithFloat:。

下表列出NSNumber的创建方法和检索方法


最后,可以查看一下NSDecimalNumber类的相关文档,它是NSNumber的子类,在对象层面提供类一些数字的四则运算方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值