Как правильно удалять елементы из 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]];