元组中数组_ObjectiveC的元组实现(JDTuple)

引言

有没有觉得OC的数组和字典使用起来特别繁琐?我们在使用字典或数组时,总是需要判断数组越界,判断数据是否为空,判断数据类型。

有没有觉得定义多参数函数的时候特别杂乱无章?

有没有觉得Swift的元组使用起来特别顺心?

这些问题其实都源于OC是一门比较古老的语言,早期设计时缺少一个足够灵活,足够好用的数据封装工具。

试想一下,假如OC也有一个元组类,这个类可以封装任意数据,包装时也无须关注数据的类型。在解构数据时可以一次性的将数据展开,无需关注越界的问题。那势必能够提高不少开发的效率,让OC这门古老的语言也swift一下。

什么是元组?

元组(tuple)是一种数据结构,它本来是一种关系型数据库的概念,用来描述一张表中的一条数据。例如:

3de0369e8f8f55ccac1dd0ca3bf3c655.png

那么一行数据就是一个元组,即: tuple1 = (阿强,18,战士);tuple2 = (阿珍,28,法师)。这个概念后来也被使用在代码中,成为一种数据封装的工具。元组可以包含任意个数和任意类型的数据,具体元组中包含什么,取决于使用时的定义。同时,元组内的元素既可以有顺序也可以有键值,但一旦定义后不可增删元素,类似于不可变的数组+字典。那么我们就尝试根据元组的定义,为OC也增加一个元组的实现。

JDTuple元组的基本使用

首先我们先来看看成品的效果,以及功能。

0 1元组构造

JDTuple通过jd_tuple(...)方法来构造一个元组,如下代码所示我们构造了一个包含三个元素的元组:

  NSString *name = @"阿珍";    NSInteger age = 28;    NSArray *arr = @[@"a", @"b", @"c"];    JDTuple *someTuple = jd_tuple(name, age, arr);

这一个方法其实包含了三个步骤:

  • 给元素定义键值:name、age、arr。
  • 给元素定义下标:0,1,2。
  • 给元素赋值:阿珍,28,["a", "b", "c"]。

当然也可以定义匿名元素的元组,直接将值传给构造方法,将默认为匿名的元素。如:

 JDTuple *someTuple = jd_tuple(@"阿强", 18, (CGRectMake(100, 200, 50.5, 7)), [NSObject new]);
0 2元组解构

1.顺序解构

JDTuple通过jd_tuple(tuple)^(...){...}方法来进行顺序元素解构,顺序解构是根据构造元组时的元素顺序来取值,根据构造时元素的顺序和类型,定义相应的变量就能获取到元素的值,如:

  JDTuple *someTuple = jd_tuple(@"阿强", 18, (CGSizeMake(5, 18)), [NSObject new]);        jd_unpack(someTuple)^(NSString *name, int age, CGSize size, NSObject *objc) {
            NSLog(@"name: %@", name);        NSLog(@"age: %d", age);        NSLog(@"width:%f, height:%f", size.width, size.height);        NSLog(@"objc: %@", objc);        //NSLog output        //name: 阿强        //age: 18        //width:5.000000, height:18.000000        //objc:     };

上述代码解构了someTuple元组,将元素在一个作用域内赋值给了name、age、size、objc变量。

当我们只需要部分元素时,我们只需要在相应的位置上定义变量就可以了,需要忽略的元素可以用arg_ph类型来占位,如:

JDTuple *someTuple = jd_tuple(@"阿强", 18, (CGSizeMake(5, 18)), [NSObject new]);        jd_unpack(someTuple)^(NSString *name, int age) {
            NSLog(@"name: %@", name);        NSLog(@"age: %d", age);        //NSLog output        //name: 阿强        //age: 18    };    jd_unpack(someTuple)^(NSString *name, arg_ph one, arg_ph two, NSObject *objc) {
            NSLog(@"name: %@", name);        NSLog(@"objc: %@", objc);        //NSLog output        //name: 阿强        //objc:     };

当相应位置的元素类型不匹配时,元素将不会被赋值,并在控制台输出提示, 如:

JDTuple *someTuple = jd_tuple(@"阿强", 18, (CGSizeMake(5, 18)), [NSObject new]);        jd_unpack(someTuple)^(NSInteger name, id age, CGSize size, NSObject *objc) {
            NSLog(@"name: %ld", name);        NSLog(@"age: %@", age);        NSLog(@"width:%f, height:%f", size.size.width, size.size.height);        NSLog(@"objc: %@", objc);        //NSLog output        //JDTuple unpack params _ 0 _ type is not match. @ != q        //JDTuple unpack params _ 1 _ type is not match. i != @        //name: 0        //age: (null)        //width:5.000000, height:18.000000        //objc:     };

2.键值解构

如果元组在构造时包含键值,则可以使用jd_unpackWithkey(...)方法,通过对应的键值解构元组,而无需关心元素顺序或个数,如:

- (void)testFunctionOne {
        NSString *name = @"阿珍";    NSInteger age = 28;    NSArray *arr = @[@"a", @"b", @"c"];    JDTuple *someTuple = jd_tuple(name, age, arr);        [self testFunctionTwo:someTuple];}- (void)testFunctionTwo:(JDTuple *)tuple {
        jd_unpackWithkey(NSInte
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值