2016-08-12 8 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」を2回見つけることはできません(NSMutableDictionaryが内部的にどのように動作するかについて何も仮定しないでください)。

+0

「意味がありますか?いいえ、それはありません。他の言語ランタイムのコレクションクラスでこのようなメソッドを見たことはありません。しかし、自分で書きたい場合は、カテゴリを作成することをお勧めします。 – Droppy

+0

"他の言語ランタイムのコレクションクラスでこのようなメソッドを見たことはありません。"それはそれが意味をなさないかどうかという議論ではありません。他の言語では、要素を見つけ出し、イテレータを取得してから、一定時間内にイテレータを使ってオブジェクトを削除することができます。ここでは、NSMutableDictionaryはおそらく "myObject"を内部的に2回、各メソッド呼び出しで1回見つけなければならないでしょう。そのため、両方を行うメソッドが完璧な意味を持ちます。とにかく、何も内蔵されていない場合、私は答えがノーだと思います。 – 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

OK、クールです。今、「保有」のこの事業... – 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 
関連する問題