NSNumber、NSValue、NSNull

NSNumber是用来包装基本数据类型

包装

其实在创建NSNumber的时候,我们就是已经将基本数据类型包装起来了

        NSNumber *intNumber = [NSNumber numberWithInt:1];
        NSNumber *longNumber = [NSNumber numberWithLong:100000];
        NSNumber *floatNumber = [NSNumber numberWithFloat:10.5];
        NSNumber *boolNumber = [NSNumber numberWithBool:true];
        NSNumber *charNumber = [NSNumber numberWithChar:'A'];
        .........
        NSArray *array = @[intNumber ,longNumber,floatNumber,boolNumber,charNumber];
        NSLog(@"%@",array);

解包装

        NSInteger intValue = [intNumber intValue];
        float floatValue = [floatNumber floatValue];
        ......
NSNumber简便的语法
        NSNumber *intNumber1 = @12;
        NSNumber *floatNumber1= @3.14;
        NSNumber *charNumber1 = @'a';
        NSNumber *boolNumber1 = @YES;
        ......
NSValue

NSValue是NSNumber的父类 可以对稍微复杂一些的结构体进行封包 但是其在项目开发过程当中并不是很常见
例如我们自定义一个结构体并把它进行包装/解包装

        NSRange range = {3, 10};
        NSValue *value = [NSValue valueWithRange:range];
       ......

除此之外NSValue一些常见的用法:


NSNumber、NSValue、NSNull_第1张图片

解包装

        NSRange range1 = [value rangeValue];
        CGPoint point = [value pointValue];
        CGRect rect = [value rectValue];
        ......
自定义结构体包装/解包装

很明显我们利用NSValue可以对一些结构体对象进行包装/解包装,但是我们自定义的结构体怎么办呢?
不要紧张,对自定义的结构体的封包和解包也有其用法:
例如:

        struct WHPoint {
            float x;
            float y;
        };
        struct WHPoint p = {5 , 10};
        
        NSValue *pointValue = [NSValue value:&p withObjCType:@encode(struct WHPoint)];

解包

        struct WHPoint p2;
        [pointValue getValue:&p2];
NSNull

NSNull 是空的意思

       NSNull *null = [NSNull null]; 创建一个空的对象

我们可以看到NSNull 只有一个类方法,除此之外并没有什么特殊的用法和属性

#import 

NS_ASSUME_NONNULL_BEGIN

@interface NSNull : NSObject 

+ (NSNull *)null;

@end
NS_ASSUME_NONNULL_END

假设我们创建一个数组 可以往数组里面存储空的对像

       NSArray *array = @[@"张三",null,@"王五"];

你可能感兴趣的:(NSNumber、NSValue、NSNull)