5

iOS 6プロジェクトのさまざまな場所で使用NSMapTableしていますが、オブジェクトにアクセスするために新しい辞書の添え字スタイルを使用できるようにしたいと考えています。(NSMapTableほとんどの場合、のように動作NSMutableDictionaryしますが、格納するキーと値のさまざまなメモリ管理オプションを使用して構成できます。このStackOverflowの質問の背景を詳しく説明します。)

NSMapTableインスタンスで添え字構文を使用しようとすると、コンパイラはこれを報告します。

タイプ'NSMapTable*'のオブジェクトに見つからないディクショナリ要素を読み取るために必要なメソッド。

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

4

2 に答える 2

4

答えは実際には簡単です。添え字の実装方法の詳細については、この質問を参照してください。このようなカテゴリを追加します。

ヘッダ:

@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

これは、添え字へのアクセスが実際には一部またはすべての場合に代替よりも実際に少し遅いかどうか疑問に思いますが、「時期尚早の最適化」という言葉はその考えを重要ではありません。

于 2012-10-31T01:11:23.017 に答える
2

NSDictionaryキーのオブジェクトの設定に関するの動作で@mjhの回答を改善しnil、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
于 2017-02-17T13:33:32.813 に答える