Objective-C Tuple
JDTuple позволяет создать кортеж с помощью метода jd_tuple(...). В следующем примере создаётся кортеж, содержащий три элемента:
NSString *name = @"Ажэнь";
NSInteger age = 28;
NSArray *arr = @[@"a", @"b", @"c"];
JDTuple *someTuple = jd_tuple(name, age, arr);
Этот метод включает в себя три шага:
Также можно создать анонимный кортеж, передав значения непосредственно в конструктор. По умолчанию элементы будут анонимными:
JDTuple *someTuple = jd_tuple(@"Ацян", 18, (CGRectMake(100, 200, 50.5, 7)), [NSObject new]);
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: <NSObject: 0x6000014279d0>
};
В этом коде 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: <NSObject: 0x6000014279d0>
};
Если тип переменной не соответствует типу соответствующего элемента, значение не будет присвоено, и в консоли появится сообщение об ошибке. Например:
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: <NSObject: 0x6000002439e0>
};
#### 2. Разбор по ключу
Если кортеж содержит ключи при создании, можно использовать метод jd_unpackWithkey(...) для разбора кортежа по ключам, без учёта порядка или количества элементов. Например:
```Objective-C
- (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(NSInteger age, NSArray *arr, NSString *name) = tuple;
NSLog(@"name: %@", name);
NSLog(@"age: %ld", age);
NSLog(@"array: %@", arr);
//NSLog output
//name: Ажэнь
//age: 28
//array: (a,b,c)
}
В методе testFunctionTwo() происходит разбор входящего параметра tuple. Элементы напрямую присваиваются одноимённым параметрам name, age и arr в области действия функции.
При попытке разобрать кортеж по несуществующему ключу или ключу несоответствующего типа, присвоение значения не произойдёт, и консоль выдаст соответствующее сообщение. Например:
- (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(NSString *name, id test1, CGFloat age) = tuple;
NSLog(@"name: %@", name);
NSLog(@"age: %f", age);
NSLog(@"test1: %@", test1);
//NSLog output
//JDTuple unpack params _ ” id test1 ” _ non-existent
//JDTuple unpack params _ “ CGFloat age ” _ type is not match. q != d
//name: Ажэнь
//age: 0.000000
//test1: (null)
}
#### 3. Получение отдельного элемента
Можно получить отдельный элемент из кортежа по индексу или ключу, аналогично работе с массивами или словарями. Полученный элемент будет упакован в NSValue. При использовании необходимо учитывать фактический тип элемента. Если индекс или ключ неверен, будет возвращено nil. Например:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )