有没有办法创建一个具有容量限制而不是初始容量的可变字典?
假设您想创建一个最多只有 100 个条目的字典。
字典的容量参数是一个初始容量,如果你添加的元素比你想要的多,它会简单地增加,所以它不合适。
有没有办法创建一个具有容量限制而不是初始容量的可变字典?
假设您想创建一个最多只有 100 个条目的字典。
字典的容量参数是一个初始容量,如果你添加的元素比你想要的多,它会简单地增加,所以它不合适。
将其子类化并覆盖 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
没有用于此的 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
,并在调用代码完成添加对象时将其剔除。