说我想要一个可变的,无序的多对多关系。出于内部优化原因,最好将其存储在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
属性应该是可变的?)
答案 0 :(得分:2)
这里没有任何邪恶。无序关系的唯一强制性变异方法是addThings:
和removeThings:
(参见the KVC doc)。 keyedThings
属性的访问者不会与任何KVC访问者发生冲突,所以你也可以。
为了让您放心,Apple已知的静态分析器检查的唯一内容是未记录的API的消息。除此之外,如果您的实施决策不影响应用程序的行为,您可以获得App Store的批准。
更新:我对此问题感兴趣,并为自己重新阅读了KVC文档。这里的语言让我停下来:
有多少无序关系 最经常使用的实例建模 NSSet或子类。在那种情况下 密钥值编码,如果没有 找到这些访问者模式 属性,直接访问集。 通常,您只实现这些 方法,如果您使用自定义 需要的集合类 被访问,好像它是一个集合。
听起来作者希望你摆脱things
并实施enumeratorOfThings:
和memberOfThings:
。
答案 1 :(得分:2)
我不会为字典创建一个属性(甚至是私有属性),但我认为它没有任何问题。
...提供
setThings
是不对的,因为things
属性应该是可变的?
是。 KVC不希望缺少setThings:
方法。