2012-10-31 9 views
5

私はNSMapTableをiOS 6プロジェクトのいくつかの場所で使用しています。オブジェクトにアクセスするために新しい辞書サブスクリプティングスタイルを使用したいと考えています。 (NSMapTableは、店舗をNSMutableDictionaryのように主に動作しますが、キーのための様々なメモリ管理オプションを設定することができ、その値より背景をthis StackOverflow questionに。。)iOS 6のNSMapTableのサブスクリプト構文

しようとしたときに、これはNSMapTableインスタンス上の構文を添字使用するようにコンパイラレポート:

「NSMapTable *」タイプのオブジェクトに見つからない辞書要素を読み取る予定のメソッドです。

カテゴリを使用してNSMapTableを拡張して、新しいNSDictionaryスタイルのサブスクリプトを許可するにはどうすればよいですか?

答えて

4

答えは実際には単純です。サブスクリプトの実装方法の詳細については、this questionを参照してください。このようなカテゴリを追加します。

ヘッダー:

@interface NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; 
- (id)objectForKeyedSubscript:(id)key; 

@end 

実装:

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key { 
    [self setObject:obj forKey:key]; 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end 

これは私が添字アクセスが一部またはすべてのケースで、実際に代替よりほんの少し遅いかどうか、一瞬、思ってしまうが、 「時期尚早最適化」という言葉は、それほど重要ではないと考えています。

+1

はIMO、これは良いアイデアではありません。 'NSMapTable'は理由のために添字を付けません。たとえば、 'NSPointerFunctionsStrongMemory'を使って' NSMapTable'を取得した場合、なぜ 'NSCopying'に従う必要がありますか?このカテゴリは実際には 'NSMapTable'を辞書のようなコレクションにしていません。 –

+0

@RudolfAdamkovicあなたはサブスクリプションメソッドの宣言で 'NSCopying'の使用を避けることができます。 – k06a

2

nilキーのオブジェクトを設定するNSDictionaryの振る舞いで改善さ@mjh答えとOBJの-Cジェネリックを追加しました:

@interface NSMapTable<KeyType, ObjectType> (Subscripting) 

- (void)setObject:(ObjectType)obj forKeyedSubscript:(KeyType)key; 
- (ObjectType)objectForKeyedSubscript:(KeyType)key; 

@end 

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id)key { 
    if (object) { 
     [self setObject:obj forKey:key]; 
    } else { 
     [self removeObjectForKey:key]; 
    } 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end