Перечислите NSArray, используя блоки, чтобы найти и сохранить все индексы всех строк NSS в массиве. - PullRequest
0 голосов
/ 22 февраля 2012

Как можно перечислить NSArray, содержащий объекты нескольких типов, чтобы получить все индексы, в которых найдена строка NSString, а затем иметь возможность ссылаться на каждый индекс по порядку, говоря что-то вроде ...

NSString *firstOccurrence = [myArray objectAtIndex:firstOccurrence];
NSString *secondOccurrence = [myArray objectAtIndex:secondOccurrence];
NSString *thirdOccurrence = [myArray objectAtIndex:thirdOccurrence];

Спасибо!

РЕДАКТИРОВАТЬ: Как я использую код (Обновлено с примером @NJones.)

Мне нужно целочисленное значение индекса, где строки хранятся в массиве,чтобы обновить свойство NSUInteger "wordDisplayed" этим значением.

В своем коде я использую модифицированную версию UIActionSheet для приема блоков: https://github.com/zoul/Lambda-Alert

NSIndexSet *stringLocations = [arrayInLesson indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return [(NSObject *)obj isKindOfClass:[NSString class]];
}];

NSArray *passingObjects = [arrayInLesson objectsAtIndexes:stringLocations];

sectionHeadersAct = [[LambdaSheet alloc] initWithTitle:@"Book 2 Lesson 1"];
[sectionHeadersAct addButtonWithTitle:@"D. E. F. & G. Teach New Letters" block:^{ 
    //Do nothing yet
}];
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:0] block:^{
    NSLog(@"First");
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson;
}];
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:1] block:^{ 
    NSLog(@"Second"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson;
}];
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:2] block:^{ 
    NSLog(@"Third"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson;
}];
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:3] block:^{ 
    NSLog(@"Fourth"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson;
}];
[sectionHeadersAct setDismissAction:^{
    //Do nothing yet
}];
[sectionHeadersAct showInView:self.view];

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Вы можете получить NSIndexSet местоположения объектов, которые вы определяете с помощью indexesOfObjectsPassingTest:.Вот так:

-(void)findStrings{
    NSArray *randomObjects = [NSArray arrayWithObjects:[NSNull null], @"String", [NSNull null], @"String", [NSNull null], nil];
    NSIndexSet *stringLocations = [randomObjects indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
        return [(NSObject *)obj isKindOfClass:[NSString class]];
    }];
    NSLog(@"strings %@",stringLocations);

        // You can get an array of just the passing objects like so:
    NSArray *passingObjects = [randomObjects objectsAtIndexes:stringLocations];
}
0 голосов
/ 22 февраля 2012

Что ж, метод enumerateObjectsUsingBlock: для NSArray позволит вам перечислять объекты в массиве, используя блок (по вашему запросу).

Чтобы проверить строки, вы можете просто сделать это:

if ([itemToTest isKindOfClass:[NSString class]]) ...

И вы можете добавить каждый из них в словарь с ключами объекта и значениями Int (или наоборот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...