1

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

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

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

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

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

这对我来说似乎很好!我可以使用访问器keyedThings在类中弄乱我的,但其他对象认为它们正在处理可变的、无序的(未键控!)多对多关系。

不过,根据良好的风格和苹果的认可等等,我担心我正在做的几件事可能是“邪恶的”。我在这里做了什么坏事吗?(例如,不提供 是不对的setThings,因为该things属性据说是可变的?)

4

2 回答 2

2

这里没有邪恶。无序关系的唯一强制突变方法是addThings:and removeThings:(参见KVC 文档)。您的keyedThings属性的访问器不会与任何 KVC 访问器发生冲突,因此您也可以。

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

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

多对无序关系通常使用 NSSet 或子类的实例来建模。在这种情况下,如果没有找到属性的这些访问器模式,键值编码将直接访问该集合。通常,只有在使用需要像集合一样访问的自定义集合类时,才实现这些方法。

听起来作者希望您摆脱things并实现enumeratorOfThings:and memberOfThings:

于 2010-03-20T02:47:37.070 回答
2

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

…不提供是不对的setThings,因为该things属性据说是可变的?

是的。KVC 不会喜欢没有setThings:方法的。

于 2010-03-20T04:04:50.747 回答