有没有办法创建容量 limit 而不是初始容量的可变字典?
假设您要创建一个最多只有100个条目的字典。
字典的容量参数是一个初始容量,如果你添加的元素超出你想要的范围,它将会简单地增加。所以它不适合。
答案 0 :(得分: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
答案 1 :(得分:1)
没有这方面的API,但执行此操作的代码非常简单:
void AddObjectToArray(NSMutableArray *array, id obj, NSUInteger maxCount) {
if ([array count] < maxCount)
[array addObject: obj];
}
请注意,上面的代码不是线程安全的,但使其线程安全就像将函数的内容包装在@synchronized (array)
指令中一样简单。
如果您想要一个可以绑定并且内置此限制的数组,不继承NSMutableArray
类集群。 NSMutableArray
的契约(它与调用代码的“协议”)表示对-addObject:
的调用会将该对象添加到数组中,而不是在数组受限制时将其添加。 / p>
相反,具有最大长度的数组的行为与标准行为不同,它不应该是NSMutableArray
的子类。这可能看起来像一个设计 - 它是一个数组,你可以改变它,因此它应该被视为NSMutableArray
。但调用代码无法知道它的修改将在您的子类上静默失败,并且可能不会在设计时考虑到这些失败。
如果调用代码是你的,你可以使用上面定义的辅助函数 - 你知道可能没有添加对象,你可以适当地编码。如果调用代码来自其他地方(例如Cocoa或其他Apple框架),请使用普通NSMutableArray
,并在调用代码完成添加对象时剔除它。