Objective-C 10 NSValue和NSNull使用方法

我们知道NSArray和NSDictionary只能存储OC对象,不能存储基本数据、struct。但有时我们需要存储呢,那怎么办呢,可以将其封装成对象。那就要用到NSValue了。

NSValue

NSValue可以封装任意值,NSNumber实际上是NSValue的子类,可以使用NSValue将结构体封装放入NSArray或NSDictionary中。

快捷初始化方法。

+(NSValue *)valueWithPoint:(NSPoint)point;
+(NSValue *)valueWithSize:(NSSize)size;
+(NSValue *)valueWithRect:(NSRect)Rect;
-(NSPoint)pointValue;
-(NSSize)sizeValue;
-(NSRect)RectValue;

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        CGSize size = CGSizeMake(50, 60);
        NSLog(@"size.width = %f,size.height = %f",size.width,size.height);
        //将结构体变量封装成对象。
        NSValue *sz = [NSValue valueWithSize:size];
        //对象可以在数组中。
        NSArray *ary = [NSArray arrayWithObject:sz];
        NSLog(@"ary =%@",ary);
        //从对象中取出结构体。
        CGSize size1 = [sz sizeValue];
        NSLog(@"size1.width = %f,size1.height = %f",size1.width,size1.height);
        BOOL result = CGSizeEqualToSize(size, size1);
        NSLog(@"result = %i",result);
    }
    return 0;
}
输出结果:
2016-01-14 18:48:31.635 命令行工程[10273:824511] size.width = 50.000000,size.height = 60.000000
2016-01-14 18:48:31.669 命令行工程[10273:824511] ary =(
    "NSSize: {50, 60}"
)
2016-01-14 18:48:31.669 命令行工程[10273:824511] size1.width = 50.000000,size1.height = 60.000000
2016-01-14 18:48:31.669 命令行工程[10273:824511] result = 1
这几个只是针对NSRect、NSSize、NSPoint这几个,如果是自定义结构体就不行了。

那就需要使用

+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

+ (NSValue *)value:(const void *)value withObjCType:(const char *)type;

#import <Foundation/Foundation.h>

typedef struct{
    int age;
    float height;
}Stu;
int main(int argc, const char * argv[]) {
    @autoreleasepool {       
        Stu st ={20,175};
        // void *代表任何指针
        // 这里要传结构体的地址&date
        
        // 根据结构体类型生成 对应的 类型描述字符串  @encode(Stu)
        NSValue *value = [NSValue valueWithBytes:&st objCType:@encode(Stu)];
        NSLog(@"@encode(Stu) = %s",@encode(Stu));
        // 定义一个结构体变量
        Stu st1;
        
        // 取出包装好的结构体
        [value getValue:&st1];
        
        // [value objCType];  取出类型描述字符串
        const char *type = [value objCType];
        NSLog(@"age=%i, height=%f", st1.age,st1.height);
        NSLog(@"type = %s",type);
    }
    return 0;
}

结果:

2016-01-14 18:48:31.670 命令行工程[10273:824511] @encode(Stu) = {?=if}
2016-01-14 18:48:31.670 命令行工程[10273:824511] age=20, height=175.000000
2016-01-14 18:48:31.670 命令行工程[10273:824511] type = {?=if}

NSNull

集合中不能存放nil值,因为nil在NSArray和NSDictionary中有特殊含义,但有时我们确实需要存储一个表示“空”的值,那么我们就可以使用NSNull,它是NSObject的子类。只有一个方法。

+ (NSNull *)null

NSNull *nl = [NSNull null];

这样就可以将nl存入数组和字典中了。

[NSNull null]总是返回一样的数值所以可以使用==将该值与其他值进行比较。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值