2016-08-12 2 views
2

Есть ли способ получить и удалить объект из NSMutableDictionary за один раз? Метод, который будет разрушаться следующее:Извлечение и удаление объекта из NSMutableDictionary за один раз

id myObject = [myMutableDict objectForKey:@"myKey"] 

if(myObject) 
{ 
    [myMutableDict removeObjectForKey:@"myKey"]; 

    ...my code... 
} 

, чтобы:

id myObject = [myMutableDict retrieveAndRemoveObjectForKey:@"myKey"]; 

if (myObject) 
{ 
    ...my code... 
} 

Я не работаю в какие-либо узкие места или что-нибудь, и я не профилированное ничего, но это только имеет смысл есть способ для удаления объекта из изменяемого словаря и возврата его за один проход, так что словарь не заканчивает поиск «myObject» дважды (я знаю, что не должен делать никаких предположений о том, как NSMutableDictionary работает внутри).

+0

«имеет смысл»? Нет, нет. Я не видел таких методов в каких-либо классах сбора в любых других языковых версиях. Однако, если вы хотите написать их самостоятельно, то создание категории - это способ продолжения. – Droppy

+0

«Я не видел таких методов в каких-либо классах сбора в любом другом времени исполнения». это вряд ли аргумент в пользу того, что это имеет смысл или нет. На других языках вы можете найти элемент, получить итератор, а затем удалить объект с помощью итератора в постоянное время. Здесь NSMutableDictionary, вероятно, придется дважды обнаруживать «myObject» дважды, один раз в каждом вызове метода, поэтому метод, который делает оба, имеет смысл. В любом случае, если нет ничего встроенного, я думаю, что ответ отрицательный. – Rajveer

+0

По крайней мере, есть такой метод в Python: https://docs.python.org/3/library/stdtypes.html#dict.pop –

ответ

0

Вы можете добавить категорию NSMutableDictionary и добавить функцию:

-(id) retrieveAndRemoveObjectForKey:(NSString*)key { 
    id myObject = [self objectForKey:@"myKey"]; 

    if(myObject) 
    { 
     [self removeObjectForKey:@"myKey"]; 
    } 

    return myObject; 
} 

, если у вас есть плохой доступ означает, что вам нужно сохранить myObject

+0

Это не категория, поскольку она ссылается на переменную, называемую 'myMutableDict'. – Droppy

+0

Спасибо, я отредактировал ответ :) –

+0

ОК, круто. Теперь этот бизнес «сохранить» ... – Droppy

0

Как было предложено, написать категорию на NSMutablArray:

NSMutableArray + Pop.h

@interface NSMutableArray (pop) 

-(id) popObjectForKey:(NSString*)key; 

@end 

NSMutableArray + Pop.m

@implementation NSMutableArray (pop) 

-(id) popObjectForKey:(NSString*)key { 
    id result = self[key]; 
    self[key] = nil; 
    return result; 
} 

@end 
Смежные вопросы