Как мы можем ограничить емкость NSMutableDictionary? - PullRequest
0 голосов
/ 23 августа 2010

Есть ли способ создать изменяемый словарь с емкостью пределом , а не с начальной емкостью?

Скажем, вы хотите создать словарь, который будет иметь только максимум100 записей.

Аргумент емкости для словаря - это начальная емкость, которая будет просто увеличена, если вы добавите больше элементов, чем хотите, поэтому она не подходит.

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Подкласс это и переопределить 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
1 голос
/ 23 августа 2010

Для этого нет API, но код для этого достаточно прост:

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

Обратите внимание, что приведенный выше код не является потокобезопасным, но сделать его потокобезопасным примерно так же просто, как заключить содержимое функции в директиву @synchronized (array).

Если вам нужен массив, который может быть объединен и имеет встроенный предел, не не наследует кластер класса NSMutableArray. Контракт NSMutableArray («соглашение», которое он имеет с вызывающим кодом) говорит, что вызов -addObject: добавит этот объект в массив, а не если он будет ограничен.

Скорее, массив с максимальной длиной ведет себя достаточно иначе, чем стандартное поведение, поэтому он не должен быть подклассом NSMutableArray. Это может показаться ухищрением - это массив, и вы можете изменить его, поэтому его следует рассматривать как NSMutableArray. Но вызывающий код не может знать, что его модификации будут молча терпеть неудачу в вашем подклассе и, вероятно, не будут разработаны с учетом таких сбоев.

Если вызывающий код принадлежит вам, вы можете использовать вспомогательную функцию, определенную выше - вы знаете, что объекты могут быть не добавлены, и вы можете кодировать соответствующим образом. Если вызывающий код поступает из другого места (например, Какао или другие платформы Apple), используйте обычный NSMutableArray и отбрасывайте его, когда вызывающий код завершает добавление объектов.

...