1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jd-platform-opensource-jdtuple

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 6.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 20:50 484eefa

JDTuple

Objective-C Tuple

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]);

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: <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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/jd-platform-opensource-jdtuple.git
git@api.gitlife.ru:oschina-mirror/jd-platform-opensource-jdtuple.git
oschina-mirror
jd-platform-opensource-jdtuple
jd-platform-opensource-jdtuple
master