EasyTuple 1.1.2

EasyTuple 1.1.2

William Zangaiqiuqiu维护。



EasyTuple 1.1.2

  • WilliamZang

EasyTuple


Build Status Version License Platform

为什么你需要它

有时候你可能会需要返回除了单一值之外的多重值。在这些情况下,你可以使用指针,如NSError **,或者你可以将它们放入数组或字典中,或者直接创建一个类来处理。但你现在还有另一个选择,EasyTuple,它能够以更好的方式组合多个值。

如何使用它

您可以使用宏EZTuple来创建一个元组,并且它支持泛型。例如这样:

EZTuple3<NSNumber *, NSString *, NSDictionary> *tuple = EZTuple(@1, @"string", nil);

EZTuple3意味着这个元组中有3个项。因此EZTuple6是6项。从EZTuple1EZTuple20共有20个类支持您使用。

EZTuple的最大容量为20。在大多数情况下这已经足够大了。如果您真的需要比这更大的东西,那么目前来说数组或字典可能是一个更好的选择。

您有多种方式来获取和设置值

EZTuple3<NSNumber *, NSString *, NSDictionary> *tuple = EZTuple(@1, @"string", nil);
// use the unpack macro
EZTupleUnpack(NSNumber *a, NSString *b, NSDictionary *c, EZT_FromVar(tuple));
NSLog(@"first:%@, second:%@, last:%@", a, b, c);
// use ordinal numbers like first, second
tuple.first;
tuple.first = @5;
// use last
tuple.last;
tuple.last = @"last";
// use subscript
tuple[0];
tuple[0] = @"s";
// iteration
BOOL hasNil = NO;
for (id value in tuple) {
    NSLog(@"%@", value);
    if (value == nil) hasNil = YES;
    tuple.first = @3 // will throw an exception!
}
// hasNil -> YES

元组中的last是“最后一个元素”的别名,在上面的示例代码中,它等同于second

元组内的所有元素都是Key-Value Observable。如果您观察了secondlast,当您改变second(或last)时,两个回调都将被调用。

EZTuple支持NSCopying协议。如果您需要的话可以轻松地复制它们。

命名元组

EZTuple1EZTuple20的元组类只有firstsecond等属性。您可能需要给属性自定义名称。命名元组能帮到您。

每个命名元组是一个类。因此您可以如此声明它:

// File TestNamedTuple.h or the other header

@import EasyTuple;

// Define a macro table with your tuple name concating 'Table'
#define TestNamedTupleTable(_) \
_(NSString *, string) \
_(NSNumber *, number) \
_(NSDictionary *, dictionary)

// Declare your class which is your tuple name
EZTNamedTupleDef(TestNamedTuple)

您应该实现这个类,因为它是一个真正的类。您可以这样实现

// File TestNamedTuple.m or the other .m file
#import "TestNamedTuple.h"

// Implement your class
EZTNamedTupleImp(TestNamedTuple)

现在您可以使用您的命名元组像使用普通类一样了

- (void)anyMethod {
    TestNamedTuple *tuple = TestNamedTupleMake(@"str", @15, @{@"key": @"value"});
    tuple.string = @"new";
    NSLog(@"property number is %@", tuple.number);
}

属性类型里有泛型吗?不必担心,它可以支持这种方式

#define TestNamedTupleWithGenericTable(_) \
_(NSArray<T> *, arr) \
_(NSDictionary<K, V> *, dic);

EZTNamedTupleDef(TestNamedTupleWithGeneric, T, K, V)

特性

  • EZTuple 宏可以快速创建元组
  • 序数字段属性
  • 索引访问
  • for-in 访问
  • 支持 NSScopy 协议
  • 删除某些项或取某些项
  • 连接两个元组
  • 将元组转换为数组或将数组转换为元组
  • 声明命名元组

优势

与 NSArray/NSDictionary 相比,EZTuple 具有以下优势

  • 支持每个元素泛型
  • 键值可观察
  • 支持 nil
  • 通过序数字段和 last 访问元素

致谢

这个库高度受到了 libextobjc 中宏技术的启发。

示例

要运行示例项目,请克隆存储库,然后从 Example 目录运行 pod install

需求

安装

EasyTuple 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile

pod "EasyTuple"

作者

WilliamZang, [email protected]

JohnnyWu, [email protected]

ValiantCat, [email protected]

许可证

EasyTuple 根据 MIT 许可证提供。有关更多信息,请参阅 LICENSE 文件。