• 【NSValue Objective-C语言】


    一、NSValue是什么意思

    1.比如,我的iOS界面上面有4个按钮,每1个按钮是不是都有自己的坐标啊,

    我想把这按钮的4个坐标存到1个数组里面去,

    你看,是不是有4个CGPoint吧,

    CGPoint p1 = CGPointMake(10,20);

    CGPoint p2 = CGPointMake(110,120);

    CGPoint p3 = CGPointMake(110,320);

    CGPoint p4 = CGPointMake(110,240);

    我拿到4个结构体啊,是不是CGPoint结构体啊

    大家思考一下,我能不能把这4个结构体,存到我的NSArray数组里面去啊,不可以

    是不是NSArray数组里面只能存OC对象啊,这4个结构体是OC对象吗,不是,

    我就是要存,怎么办呢

    那就需要先把这个结构体,包装到1个OC对象里面去,

    再把OC对象,保存到NSArray数组里面去,

    包装这个结构体的类,Foundation框架里面已经有了,叫做NSValue

    2.我们之前学习的结构体:

    1)NSRange

    2)CGPoint

    3)CGSize

    4)CGRect

    这些都是结构体,它们的变量是无法存储到集合之中的

    解决方案:

    先将这些结构体变量存储到OC对象中,再将OC对象存储到集合之中

    NSValue类的对象,就是用来包装结构体变量的

    例如,NSValue *v1 = [NSValue valueWithPoint:p1];

    这时候,我就把p1这个结构体包装到v1对象里面去了吧

    NSValue *v2 = [NSValue valueWithPoint:p2];

    NSValue *v3 = [NSValue valueWithPoint:p3];

    NSValue *v4 = [NSValue valueWithPoint:p4];

    这时候,我就把p1,p2,p3,p4这4个结构体变量,包装到v1,v2,v3,v4这4个NSValue里面去了,

    再把v1,v2,v3,v4这4个NSValue对象,存到NSArray数组里面去

    NSArray *arr = @[v1,v2,v3,v4];

    跟我们之前讲的NSNumber是不是一样一样的啊

    唯一不同的是,NSNumber是用来包装基本数据类型的,而这个NSValue呢,包装结构体的,

    好,我们现在遍历出来看一下啊,元素什么类型,NSValue,

    for(NSValue *v in arr){

    //这个时候啊,我要拿到存储在里面的结构体,该怎么拿

    //v是什么东西,这个迭代变量是我们数组中的每1个元素,对不对,数组里面的每1个元素是什么,是不是NSValue对象啊,真正那个结构体,是存在这个对象里面的吧,

    v.pointValue;

    //pointValue就可以拿到封装在这个NSValue对象当中的point结构体变量,

    NSLog(@“%@”,NSStringFromPoint(v.pointValue));

    }

    4.给大家介绍几个函数啊,

    1)(NSString *) NSStringFromPoint(NSPoint aPoint)

    之前我们讲过一个函数,

    (NSString *)NSStringFromRange(NSRange range);

    是不是它可以把这个结构体,Range结构体变量,转化成1个字符串啊

    其实还有NSStringFromPoint,

    NSStringFromSize,

    NSStringFromRect,

    这个时候,我这个NSValue里面存的是1个Point结构体吧,那我就用NSStringFromPoint,

    NSLog(@“%@”,NSStringFromPoint(v.pointValue));

    输出:{10,20}

    {110,120}

    {110,320}

    {110,240}

    二、CGSize要存进去呢

    CGSize s1 = CGSizeMake(100,10);

    CGSize s2 = CGSizeMake(100,10);

    CGSize s3 = CGSizeMake(100,10);

    CGSize s4 = CGSizeMake(100,10);

    现在,我有4个CGSize结构体吧,我想把它存到NSArray里面去,怎么存,

    先把CGSize结构体变量,放到哪儿去,NSValue对象里面去,对不对,

    NSValue *v1 = [NSValue valueWithSize:s1];

    NSValue *v2 = [NSValue valueWithSize:s2];

    NSValue *v3 = [NSValue valueWithSize:s3];

    NSValue *v4 = [NSValue valueWithSize:s4];

    NSArray *arr = @[v1,v2,v3,v4];

    for(NSValue *v in arr){

    NSLog(@“%@”,NSStringFromSize(v.sizeValue));

    }

    现在,真正的这个结构体,CGSize,是存在这个NSValue对象的属性里面的吧,哪个属性,v.sizeValue

    输出:{100,10}

    {100,10}

    {100,10}

    {100,10}

    以上,就是NSValue的全部内容

  • 相关阅读:
    数据结构(一)C语言版:绪论——数据结构基本概念真题
    OVN 流表基础 -- 基于 kubeOVN (二)
    【大模型应用开发教程】动手学大模型应用开发,一起探索LLM Universe
    Vue3系列2--项目目录介绍及运行项目
    从初级程序员到CEO,汤鹏与时代碰撞出的那些“火花”
    动态神经网络时间序列预测
    私有化+国产化,这款安全可靠的知识管理系统超赞
    DNS解析顺序是怎样的?
    【论】Balancing bike sharing systems with constraint programming
    后缀数组-模板详解
  • 原文地址:https://blog.csdn.net/madoca/article/details/128087848