Как я могу инвертировать NSArray в Objective C?

Хорошо, поэтому ответ состоял в том, чтобы добавить это к методу session.dataTask (в закрытии else).

let jsonObject = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
            let query = jsonObject["token"] as! String
            print(query)
346
задан James Harnett 30 June 2014 в 07:16
поделиться

4 ответа

Для получения обратной копии массива посмотрите решение danielpunkas с помощью reverseObjectEnumerator.

Для инвертирования изменяемого массива, можно добавить следующую категорию к коду:

@implementation NSMutableArray (Reverse)

- (void)reverse {
    if ([self count] <= 1)
        return;
    NSUInteger i = 0;
    NSUInteger j = [self count] - 1;
    while (i < j) {
        [self exchangeObjectAtIndex:i
                  withObjectAtIndex:j];

        i++;
        j--;
    }
}

@end
302
ответ дан Georg Schölly 23 November 2019 в 00:30
поделиться

Я не знаю ни о ком созданном в методе. Но, кодирование вручную не является слишком трудным. Принятие элементов массива, с которым Вы имеете дело, является объектами NSNumber целого типа, и 'прибытием' является NSMutableArray, который Вы хотите инвертировать.

int n = [arr count];
for (int i=0; i<n/2; ++i) {
  id c  = [[arr objectAtIndex:i] retain];
  [arr replaceObjectAtIndex:i withObject:[arr objectAtIndex:n-i-1]];
  [arr replaceObjectAtIndex:n-i-1 withObject:c];
}

, Так как Вы запускаете с NSArray тогда, необходимо создать изменяемый массив сначала с содержанием исходного NSArray ('origArray').

NSMutableArray * arr = [[NSMutableArray alloc] init];
[arr setArray:origArray];

Редактирование: Зафиксированные n-> n/2 в цикле рассчитывают и измененный NSNumber к более универсальному идентификатору из-за предложений в ответе Brent.

0
ответ дан Georg Schölly 23 November 2019 в 00:30
поделиться

DasBoot имеет правильный подход, но в его коде существует несколько ошибок. Вот отрывок абсолютно общего кода, который инвертирует любой NSMutableArray на месте:

/* Algorithm: swap the object N elements from the top with the object N 
 * elements from the bottom. Integer division will wrap down, leaving 
 * the middle element untouched if count is odd.
 */
for(int i = 0; i < [array count] / 2; i++) {
    int j = [array count] - i - 1;

    [array exchangeObjectAtIndex:i withObjectAtIndex:j];
}

можно обернуть это в функцию C, или для бонусных очков, использовать категории, чтобы добавить его к NSMutableArray. (В этом случае 'массив' стал бы 'сам'.) Можно также оптимизировать его путем присвоения [array count] к переменной перед циклом и использования той переменной, если Вы требуете.

, Если у Вас только есть регулярный NSArray, нет никакого способа инвертировать его на месте, потому что NSArrays не может быть изменен. Но можно сделать обратную копию:

NSMutableArray * copy = [NSMutableArray arrayWithCapacity:[array count]];

for(int i = 0; i < [array count]; i++) {
    [copy addObject:[array objectAtIndex:[array count] - i - 1]];
}

Или использование этот небольшой прием, чтобы сделать это в одной строке:

NSArray * copy = [[array reverseObjectEnumerator] allObjects];

, Если Вы просто хотите циклично выполниться по массиву назад, можно использовать for / in цикл с [array reverseObjectEnumerator], но, вероятно, немного более эффективно использовать -enumerateObjectsWithOptions:usingBlock::

[array enumerateObjectsWithOptions:NSEnumerationReverse
                        usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    // This is your loop body. Use the object in obj here. 
    // If you need the index, it's in idx.
    // (This is the best feature of this method, IMHO.)
    // Instead of using 'continue', use 'return'.
    // Instead of using 'break', set '*stop = YES' and then 'return'.
    // Making the surrounding method/block return is tricky and probably
    // requires a '__block' variable.
    // (This is the worst feature of this method, IMHO.)
}];

( Примечание : Существенно обновленный в 2014 с еще пятью годами опыта Основы, новой функции Objective-C или два, и пара подсказок из комментариев.)

20
ответ дан Brent Royal-Gordon 23 November 2019 в 00:30
поделиться

Существует намного более легкое решение при использовании в своих интересах встроенного reverseObjectEnumerator метод на NSArray, и allObjects метод NSEnumerator:

NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];

allObjects документируется как возврат массива с объектами, которые еще не были пересечены с nextObject в порядке:

Этот массив содержит все остающиеся объекты перечислителя в перечислимом порядке .

1266
ответ дан Pang 23 November 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: