这是一种很好的符合KVO标准的方式来建立可变对多关系吗?

时间:2010-03-20 00:28:18

标签: cocoa key-value-observing

说我想要一个可变的,无序的多对多关系。出于内部优化原因,最好将其存储在NSMutableDictionary而不是NSMutableSet中。但是我想将这个实现细节保密。

我还想提供一些符合KVO标准的访问者,所以:

- (NSSet*)things;
- (NSUInteger)countOfThings;
- (void)addThings:(NSSet*)someThings;
- (void)removeThings:(NSSet*)someThings;

现在,为字典提供访问器(当然,在我的实现文件中也是私有的)是方便而且不那么邪恶的,所以:

@interface MYClassWithThings ()
@property (retain) NSMutableDictionary* keyedThings;
@end

这对我来说似乎很好!我可以使用访问器来破坏类中的keyedThings,但是其他对象认为它们处理的是一个可变的,无序的(,无键的!)到多对的关系。

我担心我正在做的一些事情可能是“邪恶的”,根据良好的风格和Apple的批准和诸如此类的东西。我在这里做过什么恶事吗? (例如,提供setThings是不对的,因为things属性应该是可变的?)

2 个答案:

答案 0 :(得分:2)

这里没有任何邪恶。无序关系的唯一强制性变异方法是addThings:removeThings:(参见the KVC doc)。 keyedThings属性的访问者不会与任何KVC访问者发生冲突,所以你也可以。

为了让您放心,Apple已知的静态分析器检查的唯一内容是未记录的API的消息。除此之外,如果您的实施决策不影响应用程序的行为,您可以获得App Store的批准。

更新:我对此问题感兴趣,并为自己重新阅读了KVC文档。这里的语言让我停下来:

  

有多少无序关系   最经常使用的实例建模   NSSet或子类。在那种情况下   密钥值编码,如果没有   找到这些访问者模式   属性,直接访问集。   通常,您只实现这些   方法,如果您使用自定义   需要的集合类   被访问,好像它是一个集合。

听起来作者希望你摆脱things并实施enumeratorOfThings:memberOfThings:

答案 1 :(得分:2)

我不会为字典创建一个属性(甚至是私有属性),但我认为它没有任何问题。

  

...提供setThings是不对的,因为things属性应该是可变的?

是。 KVC不希望缺少setThings:方法。