Как правильно удалять елементы из NSMutableSet при прохождении по нему?

Я не разрабатываю под Mac, но возникла необходимость поправить баг в Obj-C коде.
Есть NSMutableSet элементов, по которым нужно пройтись и при выполнении определённых условий удалить елемент, сократив этот set. В С++ это делается проходом итераторами по контейнеру в стиле if (remove) it = container.erase(); else ++it;. Как выглядит аналог этого на Objective-C для NSMutableSet?


Ответы (1 шт):

Автор решения: VAndrJ

Вы можете сделать это несколькими способами. Для примера возьмем Set со строками:

NSMutableSet<NSString *> *someSet = [NSMutableSet setWithObjects: @"1", @"2", @"3", @"4", nil];

И первый способ – пройтись по нему, удаляя ненужные объекты:

[[someSet copy] enumerateObjectsUsingBlock:^(id _Nonnull element, NSUInteger idx, BOOL * _Nonnull stop) {
    if ([element isEqualToString:@"2"] || [element isEqualToString:@"4"]) {
        [someSet removeObject:element];
    }
}];
// И, по сути, его вариация:
for (NSString* element in [someSet copy]) {
    if ([element isEqualToString:@"2"] || [element isEqualToString:@"4"]) {
        [someSet removeObject:element];
    }
}

Другой, более предпочтительный способ – сформировать Set из ненужных объектов и вычесть его:

[someSet minusSet:[NSMutableSet setWithObjects:@"2", @"4", nil]];
→ Ссылка