0

有没有办法创建一个具有容量限制而不是初始容量的可变字典?

假设您想创建一个最多只有 100 个条目的字典。

字典的容量参数是一个初始容量,如果你添加的元素比你想要的多,它会简单地增加,所以它不合适。

4

2 回答 2

2

将其子类化并覆盖 addObject 以在添加之前检查计数?没有内置方式。

这是一个基本示例...未测试,缺少初始化等,但这是核心。您还应该以类似的方式覆盖 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)指令中一样简单。

如果您想要一个可以随意组合并内置此限制的数组,请不要NSMutableArray类集群子类化。NSMutableArray的合同(它与调用代码的“协议”)说调用-addObject:会将该对象添加到数组中,而不是如果数组低于限制则它会。

相反,具有最大长度的数组的行为与标准行为完全不同,它不应该是NSMutableArray. 这看起来像是一个发明——它是一个数组,你可以改变它,因此它应该被视为一个NSMutableArray. 但是调用代码无法知道它的修改会在您的子类上静默失败,并且可能不会在设计时考虑到此类失败。

如果调用代码是你的,你可以使用上面定义的辅助函数——你知道对象可能不会被添加,你可以适当地编码。如果调用代码来自其他地方(例如 Cocoa 或其他 Apple 框架),请使用 normal NSMutableArray,并在调用代码完成添加对象时将其剔除。

于 2010-08-23T05:35:16.757 回答