免费开源的iOS开发学习平台

NSNumber基本使用

在编程的过程中,一些基本数据类型的变量是必不可少的,但是在Objective-C编程语言当中,Objective-C的消息机制并不能向这些基本数据类型发送消息,而且Objective-C的集合(如:数组)当中是不能存放基本数据类型的,所以我们就需要将基本数据类型转化成对象来使用。Objective-C中提供了NSNumber类来将基本数据类型“包装”成数字对象,这样我们就可以将基本数据类型当做对象来处理了。

NSNumber对象创建

当我们需要把基本数据类型转换成NSNumber类型的对象时,转换方式通常有以下两种。

  • 使用@符号进行快速封装;

  • 调用NSNumber类提供的方法。通过调用NSNumber类中提供的方法,NSNumber类型的对象不仅仅可以转换int、float、double这些常规的基本数字类型,还可以包装char、BOOL,但并不常用。

+ (NSNumber *)numberWithInt:(int)value; //转换int
+ (NSNumber *)numberWithFloat:(float)value; //转换float
+ (NSNumber *)numberWithDouble:(double)value; //转换double
+ (NSNumber *)numberWithBool:(BOOL)value; //转换bool
+ (NSNumber *)numberWithInteger:(NSInteger)value; //转换NSInteger

下方的示例代码中演示了常用的基本数据类型转换成NSNumber对象的方法,当我们需要打印NSNumber对象时,在NSLog()中需要使用%@。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //NSNumber对象创建
        //快速创建
        NSNumber * intNum1 = @10;
        NSNumber * floatNum1 = @3.14;
        //使用类方法创建
        NSNumber * intNum2 = [NSNumber numberWithInt:10];
        NSNumber * floatNum2 = [NSNumber numberWithFloat:3.14];
        NSNumber * integerNum = [NSNumber numberWithInteger:100];
        NSNumber * doubleNum = [NSNumber numberWithDouble:100.01];
        NSLog(@"%@--%@--%@--%@--%@--%@", intNum1, intNum2,floatNum1,floatNum2,integerNum,doubleNum);
    }
    return 0;
}

运行结果:

NSNumber对象与基本数据类型之间的转换

基本数据类型可以转换为NSNumber之外,NSNumber类的对象也可以转换成基本数据类型,在NSNumber类中也提供了对应的属性与方法。

@property (readonly) int intValue; //NSNumber对象转成int
@property (readonly) float floatValue; //NSNumber对象转成float
@property (readonly) double doubleValue; //NSNumber对象转成double
@property (readonly) BOOL boolValue; //NSNumber对象转成BOOL
@property (readonly) NSInteger integerValue; //NSNumber对象转成NSInteger

下方的示例代码演示了如何把NSNumber对象转换成其他基本数据类型。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //使用类方法创建
        NSNumber * intNum = [NSNumber numberWithInt:10];
        NSNumber * floatNum = [NSNumber numberWithFloat:3.14];
        NSNumber * integerNum = [NSNumber numberWithInteger:100];
        NSNumber * doubleNum = [NSNumber numberWithDouble:100.01];
        
        //转换成基本数据类型
        int intBasic = [intNum intValue];
        float floatBasic = [floatNum floatValue];
        double doubleBasic = [doubleNum doubleValue];
        NSInteger integerBasic = [integerNum integerValue];
        NSLog(@"%d--%f--%f--%ld",intBasic,floatBasic, doubleBasic,(long)integerBasic);
    }
    return 0;
}

运行结果:

对比

  • int : 当使用int类型定义变量的时候,可以像写C程序一样去使用。当你不知道程序运行在哪种处理器架构时,你最好使用NSInteger,因为int在32位系统中也许只是int类型,而在64位系统中int可能变成long型。除非不得不使用int/long型,否则推荐使用NSInteger。

  • NSInteger/NSUInteger是一种动态定义的类型,在不同的设备,不同的架构,有可能是int类型,有可能是long类型。NSUInteger是无符号的,即没有负数,NSInteger是有符号的。

  • NSInteger是基础类型,NSNumber是一个类,如果需要在数组中存储一个数值,直接使用NSInteger是不行的,因为Objective-C的集合当中存储的数据必须是对象。

示例代码

https://github.com/99ios/4.5