为什么你需要它
有时候你可能会需要返回除了单一值之外的多重值。在这些情况下,你可以使用指针,如NSError **
,或者你可以将它们放入数组或字典中,或者直接创建一个类来处理。但你现在还有另一个选择,EasyTuple,它能够以更好的方式组合多个值。
如何使用它
您可以使用宏EZTuple
来创建一个元组,并且它支持泛型。例如这样:
EZTuple3<NSNumber *, NSString *, NSDictionary> *tuple = EZTuple(@1, @"string", nil);
EZTuple3
意味着这个元组中有3个项。因此EZTuple6
是6项。从EZTuple1
到EZTuple20
共有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。如果您观察了second
和last
,当您改变second
(或last
)时,两个回调都将被调用。
EZTuple支持NSCopying
协议。如果您需要的话可以轻松地复制它们。
命名元组
从EZTuple1
到EZTuple20
的元组类只有first
、second
等属性。您可能需要给属性自定义名称。命名元组能帮到您。
每个命名元组是一个类。因此您可以如此声明它:
// 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 文件。