0

初期容量ではなく容量制限のある可変辞書を作成する方法はありますか?

最大で100個のエントリしか含まない辞書を作成するとします。

ディクショナリの容量引数は初期容量であり、必要以上に要素を追加すると単純に増加するため、適切ではありません。

4

2 に答える 2

2

それをサブクラス化し、addObjectをオーバーライドして、追加する前にカウントをチェックしますか?組み込みの方法はありません。

これが基本的な例です...テストされていない、initがないなどですが、これがコアです。同様の方法でsetValue:forKey:もオーバーライドする必要があります。

@interface MyMutableDictionary: NSMutableDictionary

- (BOOL) setObject:(id)anObject forKey:(id)aKey;

@end

@implementation MyMutableDictionary

- (BOOL) setObject:(id)anObject forKey:(id)key {
    if ([self count] < yourLimit) {
        [super setObject:anObject forKey:key];
        return YES;
    }
    return NO;
}

@end
于 2010-08-23T05:26:58.633 に答える
1

このためのAPIはありませんが、そうするためのコードはかなり単純です。

void AddObjectToArray(NSMutableArray *array, id obj, NSUInteger maxCount) {
    if ([array count] < maxCount)
        [array addObject: obj];
}

@synchronized (array)上記のコードはスレッドセーフではありませんが、スレッドセーフにするのは、関数の内容をディレクティブでラップするのと同じくらい簡単であることに注意してください。

バンディできる配列が必要で、この制限が組み込まれている場合は、クラスクラスタをサブクラス化しないでください。のコントラクト(呼び出しコードとの「合意」)では、を呼び出すと、そのオブジェクトが配列に追加されますが、配列が制限を下回っている場合は追加されません。NSMutableArrayNSMutableArray-addObject:

むしろ、最大長の配列は、標準の動作とは十分に異なる動作をするため、のサブクラスであってはなりませんNSMutableArray。これは工夫のように思えるかもしれません。これは配列であり、変更できるため、として扱うことができますNSMutableArray。しかし、呼び出しコードには、その変更がサブクラスでサイレントに失敗することを知る方法がなく、おそらくそのような失敗を念頭に置いて設計されていないでしょう。

呼び出し元のコードが自分のものである場合は、上記で定義したヘルパー関数を使用できます。オブジェクトが追加されない可能性があり、適切にコーディングできます。呼び出し元のコードが他の場所(Cocoaや他のAppleフレームワークなど)からのものである場合は、通常のを使用しNSMutableArray、呼び出し元のコードがオブジェクトの追加を完了したときにそれをカリングします。

于 2010-08-23T05:35:16.757 に答える